使用 For 循环修改 Pandas 中的 DataFrame 字典
Posted
技术标签:
【中文标题】使用 For 循环修改 Pandas 中的 DataFrame 字典【英文标题】:Using a For Loop to modify a dictionary of DataFrames in Pandas 【发布时间】:2017-05-09 02:26:30 【问题描述】:我正在阅读有关 Pandas 的教程。我决定用我认为应该直截了当的方法进行中途试验。我将其浓缩为一个简单的代码,供其他人亲自重现并帮助我查看我的错误或 Python 中的错误。
df = pd.DataFrame('A': 1.,
'B': pd.Timestamp('20130102'),
'C': pd.Series(1, index = list(range(4)), dtype = 'float32'),
'D': np.array([3] * 4, dtype = 'int32'),
'E': pd.Categorical(["test", "train", "test", "train"]),
'F': 'foo'
)
# Made copy of df and modified it individually to show that it works.
df2 = df
df2.drop([1,3], inplace=True) # Dropping 2nd and 5th row.
print(df2)
# Now trying to do the same for multiple dataframes in a
# dictionary keeps giving me an error.
dic = '1900' : df, '1901' : df, '1902' : df # Dic w/ 3 pairs.
names = ['1900', '1901', '1902'] # The dic keys in list.
# For loop to drop the 2nd and 4th row.
for ii in names:
df_dic = dic[str(ii)]
df_dic.drop([1,3], inplace=True)
dic[str(ii)] = df_dic
我得到的输出是:
A B C D E F
0 1.0 2013-01-02 1.0 3 test foo
2 1.0 2013-01-02 1.0 3 test foo
--------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-139-8236a9c3389e> in <module>()
21 for ii in names:
22 df_dic = dic[str(ii)]
---> 23 df_dic.drop([1,3], inplace=True)
C:\Anaconda3\lib\site-packages\pandas\core\generic.py in drop(self, labels, axis, level, inplace, errors)
1905 new_axis = axis.drop(labels, level=level, errors=errors)
1906 else:
-> 1907 new_axis = axis.drop(labels, errors=errors)
1908 dropped = self.reindex(**axis_name: new_axis)
1909 try:
C:\Anaconda3\lib\site-packages\pandas\indexes\base.py in drop(self, labels, errors)
3260 if errors != 'ignore':
3261 raise ValueError('labels %s not contained in axis' %
-> 3262 labels[mask])
3263 indexer = indexer[~mask]
3264 return self.delete(indexer)
ValueError: labels [1 3] not contained in axis
显然,在单独执行时删除行是可行的,因为它给了我想要的输出。为什么在 For Loop
中实现会使其行为异常?
提前致谢。
【问题讨论】:
我认为你需要添加copy
like df_dic = dic[str(ii)].copy()
【参考方案1】:
你需要copy
DataFrame
:
for ii in names:
df_dic = dic[str(ii)].copy()
df_dic.drop([1,3], inplace=True)
dic[str(ii)] = df_dic
print (dic)
'1900': A B C D E F
0 1.0 2013-01-02 1.0 3 test foo
2 1.0 2013-01-02 1.0 3 test foo, '1902': A B C D E F
0 1.0 2013-01-02 1.0 3 test foo
2 1.0 2013-01-02 1.0 3 test foo, '1901': A B C D E F
0 1.0 2013-01-02 1.0 3 test foo
2 1.0 2013-01-02 1.0 3 test foo
Copying in docs.
【讨论】:
这很有意义。但是在添加copy()
之后,我仍然得到完全相同的错误。它指向错误消息中df_dic = dic[str(ii)].copy()
之后的行。感谢您的快速回复。
也许在你的代码中df2 = df
也很重要添加copy
。 ;)
高五!!就是这样。非常感谢!顺便说一句,我可以发誓你有一个东西的链接。现在它已经消失了。这对我有帮助吗?
我认为没有,我只在答案末尾添加链接。
是的,这就是我所指的链接。我想我疲倦的眼睛第二次忘记了它。哈哈。没问题。你回答正确,所以它是给定的。 :)以上是关于使用 For 循环修改 Pandas 中的 DataFrame 字典的主要内容,如果未能解决你的问题,请参考以下文章