python - Creating Loops in Pandas
问题描述
I am trying to turn this into a loop variable to save space but unsure what I am doing wrong-
This is the code fully written out-
df0 = pd.crosstab(df['Gender: What gender do you identify with?'], df[Banner[0]], normalize= 'columns')
df1 = pd.crosstab(df['Gender: What gender do you identify with?'], df[Banner[1]], normalize= 'columns')
df2 = pd.crosstab(df['Gender: What gender do you identify with?'], df[Banner[2]], normalize= 'columns')
df3 = pd.crosstab(df['Gender: What gender do you identify with?'], df[Banner[3]], normalize= 'columns')
df4 = pd.crosstab(df['Gender: What gender do you identify with?'], df[Banner[4]], normalize= 'columns')
df5 = pd.crosstab(df['Gender: What gender do you identify with?'], df[Banner[5]], normalize= 'columns')
df6 = pd.crosstab(df['Gender: What gender do you identify with?'], df[Banner[6]], normalize= 'columns')
df7 = pd.crosstab(df['Gender: What gender do you identify with?'], df[Banner[7]], normalize= 'columns')
df8 = pd.crosstab(df['Gender: What gender do you identify with?'], df[Banner[8]], normalize= 'columns')
df9 = pd.crosstab(df['Gender: What gender do you identify with?'], df[Banner[9]], normalize= 'columns')
df10 = pd.crosstab(df['Gender: What gender do you identify with?'], df[Banner[10]], normalize= 'columns')
df11 = pd.crosstab(df['Gender: What gender do you identify with?'], df[Banner[11]], normalize= 'columns')
df12 = pd.crosstab(df['Gender: What gender do you identify with?'], df[Banner[12]], normalize= 'columns')
When I try to create a loop with this-
for i in range(0, len(Banner)):
df[i] = (pd.crosstab(df['Gender: What gender do you identify with?'], df[Banner[i]], normalize= 'columns'))
I run into this error-
---------------------------------------------------------------------------
KeyError Traceback (most recent call last)
~\Anaconda3\lib\site-packages\pandas\core\indexes\base.py in get_loc(self, key, method, tolerance)
2888 try:
-> 2889 return self._engine.get_loc(casted_key)
2890 except KeyError as err:
pandas\_libs\index.pyx in pandas._libs.index.IndexEngine.get_loc()
pandas\_libs\index.pyx in pandas._libs.index.IndexEngine.get_loc()
pandas\_libs\hashtable_class_helper.pxi in pandas._libs.hashtable.PyObjectHashTable.get_item()
pandas\_libs\hashtable_class_helper.pxi in pandas._libs.hashtable.PyObjectHashTable.get_item()
KeyError: 2
The above exception was the direct cause of the following exception:
KeyError Traceback (most recent call last)
~\Anaconda3\lib\site-packages\pandas\core\generic.py in _set_item(self, key, value)
3564 try:
-> 3565 loc = self._info_axis.get_loc(key)
3566 except KeyError:
~\Anaconda3\lib\site-packages\pandas\core\indexes\base.py in get_loc(self, key, method, tolerance)
2890 except KeyError as err:
-> 2891 raise KeyError(key) from err
2892
KeyError: 2
During handling of the above exception, another exception occurred:
ValueError Traceback (most recent call last)
<ipython-input-35-1630d74a377e> in <module>
1 for i in range(0, len(Banner)):
----> 2 df[i] = (pd.crosstab(df['Gender: What gender do you identify with?'], df[Banner[i]], normalize= 'columns'))
~\Anaconda3\lib\site-packages\pandas\core\frame.py in __setitem__(self, key, value)
3038 else:
3039 # set column
-> 3040 self._set_item(key, value)
3041
3042 def _setitem_slice(self, key: slice, value):
~\Anaconda3\lib\site-packages\pandas\core\frame.py in _set_item(self, key, value)
3115 self._ensure_valid_index(value)
3116 value = self._sanitize_column(key, value)
-> 3117 NDFrame._set_item(self, key, value)
3118
3119 # check if we are modifying a copy
~\Anaconda3\lib\site-packages\pandas\core\generic.py in _set_item(self, key, value)
3566 except KeyError:
3567 # This item wasn't present, just insert at end
-> 3568 self._mgr.insert(len(self._info_axis), key, value)
3569 return
3570
~\Anaconda3\lib\site-packages\pandas\core\internals\managers.py in insert(self, loc, item, value, allow_duplicates)
1187 value = _safe_reshape(value, (1,) + value.shape)
1188
-> 1189 block = make_block(values=value, ndim=self.ndim, placement=slice(loc, loc + 1))
1190
1191 for blkno, count in _fast_count_smallints(self.blknos[loc:]):
~\Anaconda3\lib\site-packages\pandas\core\internals\blocks.py in make_block(values, placement, klass, ndim, dtype)
2712 values = DatetimeArray._simple_new(values, dtype=dtype)
2713
-> 2714 return klass(values, ndim=ndim, placement=placement)
2715
2716
~\Anaconda3\lib\site-packages\pandas\core\internals\blocks.py in __init__(self, values, placement, ndim)
128 if self._validate_ndim and self.ndim and len(self.mgr_locs) != len(self.values):
129 raise ValueError(
--> 130 f"Wrong number of items passed {len(self.values)}, "
131 f"placement implies {len(self.mgr_locs)}"
132 )
ValueError: Wrong number of items passed 2, placement implies 1
I have also tried-
i = 0
while i < 10:
df[i] = (pd.crosstab(df['Gender: What gender do you identify with?'], df[Banner[i]], normalize= 'columns'))
i = i+1
And I run into the same error.
Is there a way to loop these variables in python or a faster way than manually writing it out.
Any help would be greatly appreciated.
Thanks
解决方案
您正在尝试动态创建一个变量名,而这样做的一种方法是使用 global() 方法
for i in range(13):
globals()['df{}'.format(i)] = i*1000
一旦你运行,你可以调用变量,所以
In [5]: df12
Out[5]: 12000
用您想要的输出替换 i*1000
推荐阅读
- python - 使用正则表达式从单个字符串中解析字符串模式
- woocommerce - 我正在使用脚本不发送电子邮件进行零续订它适用于客户电子邮件但不适用于管理员电子邮件
- kotlin - 未解决的引用:使用 `it` 引用数字类型时的 MAX_VALUE
- javascript - JS:如何为页面滚动添加摩擦/动力?
- python - 如何使用模仿此 R 代码行为的 Python 将文件发布到服务器?
- databricks - Aws S3 到 Databricks 挂载不起作用
- python - 将分割图矢量化为 RGB 颜色
- python-3.x - 谷歌分析管理 API
- flutter - 如何导入颤振(不是飞镖)收藏库?
- react-native - 为什么 hitSlop 在这个嵌套的 TouchableOpacity 组件中不起作用?