Pandas: 设置副本警告

20 投票
4 回答
36274 浏览
提问于 2025-04-18 02:18

我想把一个 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

根据这个StackExchange的问题,有时候这个警告可以忽略,但我不太能理解讨论的内容,所以不确定这是否适用于我的情况。这个警告基本上是在告诉我,我会覆盖掉 DataFrame 中的一些值吗?

补充:就我所知,一切都按预期工作。接下来,我想问一下,我替换值的方法算不算不标准?有没有更好的方法来替换值?

4 个回答

1

根据其他用户的建议,你可以尝试:

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

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

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

另外,你可以查看:

Pandas 的 SettingWithCopyWarning

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

3

---问题对我来说解决了---

我在尝试把浮点数转换成整数时遇到了一个警告错误,即使我使用了“.loc”命令。我的错误在于,我在进行转换之前就用筛选条件过滤了我的数据框,这样转换只发生在数据框的一小部分项/列上,结果导致了一个混合类型的列,造成了困惑。我通过在应用筛选条件之前先转换数据框来解决这个问题,希望这能帮到你。

4

我在尝试重置整个数据框的内容时收到了这个警告,但用 lociloc 解决不了这个问题:

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

不过,直接使用作为数据的 ndarray 来解决这个问题就可以了:

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

根据错误信息的提示,你应该使用 loc 来完成这个操作:

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

这个警告是为了提醒你不要修改一个副本(这里 sve2_all[sve2_all[' Hgtot ng/l'] > 100] 可能是一个副本,如果真的是副本的话,任何修改都不会影响到原始的数据框。虽然在某些情况下它可能会正常工作,但 pandas 并不能保证在所有情况下都能正常工作……使用时请自行承担风险(算是给你提个醒! ;))。

撰写回答