我有这个代码示例,它应该使用group-by将数据帧拆分为较小的数据帧,如果'num'列中的数字是偶数,则修改较小的数据帧:
import pandas as pd
df = pd.DataFrame({
'id1': [1]*5+[2]*5,
'num': range(11, 21),
'x': range(10)
})
print df
for id1, grouped_df in df.groupby('id1'):
grouped_df.loc[grouped_df['num'] % 2 == 0, 'num'] = 'even'
print grouped_df
print df
然而,当我运行此代码时,我遇到警告:
/usr/local/lib/python2.7/dist-packages/pandas/core/indexing.py:537: SettingWithCopyWarning:尝试在a的副本上设置值 从DataFrame切片。尝试使用.loc [row_indexer,col_indexer] = 代替值
请参阅文档中的警告: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy
并且在“真实”数据上运行时代码非常慢。
根据我的理解,此警告提示使用loc
,但我已经在使用它了!
pandas是否将group-by返回的数据帧视为切片?我怎样才能摆脱这种警告并确保预期的行为?
答案 0 :(得分:1)
使用copy
:
for id1, grouped_df in df.groupby('id1'):
grouped_df = grouped_df.copy()
grouped_df.loc[grouped_df['num'] % 2 == 0, 'x'] = 'even'
print (grouped_df)
id1 num x
0 1 11 0
1 1 12 even
2 1 13 2
3 1 14 even
4 1 15 4
id1 num x
5 2 16 even
6 2 17 6
7 2 18 even
8 2 19 8
9 2 20 even