将标量指定给列时的SettingWithCopyWarning

时间:2016-01-26 01:55:06

标签: python pandas

我使用熊猫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

1 个答案:

答案 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}},因为它不太容易出错。