熊猫:SettingWithCopyWarning

时间:2014-04-11 03:04:50

标签: python python-2.7 pandas chained-assignment

我想将Pandas DataFrame中的值替换为大于任意数字(在本例中为100)NaN的值(因为这个值很大,表示实验失败)。以前我用它来替换不需要的值:

sve2_all[sve2_all[' Hgtot ng/l'] > 100] = np.nan

但是,我收到以下错误:

-c:3: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_index,col_indexer] = value instead
C:\Users\AppData\Local\Enthought\Canopy32\User\lib\site-packages\pandas\core\indexing.py:346: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_index,col_indexer] = value instead
self.obj[item] = s

this StackExchange question开始,似乎有时可以忽略此警告,但我不能很好地跟进讨论,以确定这是否适用于我的情况。该警告是否基本上让我知道我将覆盖DataFrame中的一些值?

编辑:据我所知,一切都表现得应有尽有。跟进是我取代非标准价值的方法吗?有没有更好的方法来替换价值观?

4 个答案:

答案 0 :(得分:23)

根据错误消息的建议,您应该使用loc来执行此操作:

sve2_all.loc[sve2_all['Hgtot ng/l'] > 100] = np.nan

警告此处是为了阻止您修改副本(此处sve2_all[sve2_all[' Hgtot ng/l'] > 100] 可能一个副本,如果是,则任何修改都不会更改原始框架。可能是因为它在某些情况下可以正常工作,但是熊猫不能保证它在所有情况下都能正常工作......使用风险自负(考虑自己警告!;))。

答案 1 :(得分:2)

我在尝试重置整个DataFrame的内容时收到此警告但无法使用lociloc解决此问题:

df.loc[:, :] = new_values # SettingWithCopyWarning
df.iloc[:, :] = new_values # SettingWithCopyWarning

但解析为包含数据的ndarray解决了问题:

df.values[:, :] = new_values # no warnings and desired behavior

答案 2 :(得分:2)

---问题解决了我---

当我尝试转换浮动时,我遇到了交战错误 - > int,即使我使用“.loc”命令。我的错误是我在操作之前过滤了我的dataFrame(带有掩码),因此转换仅发生在数据框项/列的一小部分中,结果是一个混合类型列,它创建了一个混淆。我通过在掩码之前转换数据帧来解决问题(数据过滤),我希望它会有所帮助。

答案 3 :(得分:1)

正如其他用户建议的那样,您可以尝试:

myindex = sve2_all[' Hgtot ng/l'] > 100

sve2_all.loc[myindex, 'yourcolumn'] = np.nan

请记住,如果在创建数据透视表(row不支持的pivot_table pandas 0.16.0 #417关键字)时遇到问题,则应使用索引和列的新语法而不是行和列。 https://github.com/yhat/ggplot/issues/417

另见:

Pandas SettingWithCopyWarning

http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy