我使用熊猫17.1。在SO上广泛讨论了处理SettingWithCopyWarning,但我不相信the most popular thread看起来像我的用例,它正在为一个列分配一个标量。
我的代码:
df.loc[:, "some_col_name"] = 0
假设列名为" some_col_name"已经存在;这不是添加列(如果这样的声明甚至可以)。
它会产生一个SettingWithCopyWarning,而在我的生命中,我无法弄清楚原因。
当我首先设置df.is_copy = False时它会起作用,但是如果可能的话,我每次都要避免使用额外的语句。
我在这里做错了什么?
谢谢!
对johnchase的回复的后续回复: df是由groupby语句创建的(见下文),所以我不知道我在哪里添加.copy。我提到的补救措施有效,但我必须这样做,这对我来说意味着大熊猫使得groupby迭代没有意识到它们是复制品。 (但他们是对的?)
for some_ix, df in bigger_df.groupby(cols_I_care_about):
df.loc[:, "some_col_name"] = 0
答案 0 :(得分:1)
我的猜测是df_old = pd.DataFrame(data=np.arange(15).reshape(5, 3), columns=['a', 'b', 'c'])
df = df_old[['a', 'c']]
df.loc[:, 'c'] = 0
是从先前存在的数据帧创建的数据帧。请参阅以下内容:
SettingWithCopyWarning
这会产生SettingWithCopyWarning
。下一个代码块不会产生df_old = pd.DataFrame(data=np.arange(15).reshape(5, 3), columns=['a', 'b', 'c'])
df = df_old[['a', 'c']].copy()
df.loc[:, 'c'] = 0
.copy()
pandas警告您可能正在修改原始数据框。您可以使用df.is_copy = False
方法确保创建新数据框而不是修改原始数据,或者.copy()
。我不同意你的解决方案是一个警察,但更喜欢在创建新数据帧时使用{{1}},因为它不太容易出错。