Pandas: 设置副本警告
我想把一个 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 个回答
根据其他用户的建议,你可以尝试:
myindex = sve2_all[' Hgtot ng/l'] > 100
sve2_all.loc[myindex, 'yourcolumn'] = np.nan
请记住,如果你在创建透视表时遇到问题(比如 pandas 0.16.0 #417
不支持 pivot_table
的 row
关键字),你应该使用新的语法,改用索引和列,而不是行和列。https://github.com/yhat/ggplot/issues/417
另外,你可以查看:
Pandas 的 SettingWithCopyWarning
http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy
---问题对我来说解决了---
我在尝试把浮点数转换成整数时遇到了一个警告错误,即使我使用了“.loc”命令。我的错误在于,我在进行转换之前就用筛选条件过滤了我的数据框,这样转换只发生在数据框的一小部分项/列上,结果导致了一个混合类型的列,造成了困惑。我通过在应用筛选条件之前先转换数据框来解决这个问题,希望这能帮到你。
我在尝试重置整个数据框的内容时收到了这个警告,但用 loc
或 iloc
解决不了这个问题:
df.loc[:, :] = new_values # SettingWithCopyWarning
df.iloc[:, :] = new_values # SettingWithCopyWarning
不过,直接使用作为数据的 ndarray 来解决这个问题就可以了:
df.values[:, :] = new_values # no warnings and desired behavior
根据错误信息的提示,你应该使用 loc 来完成这个操作:
sve2_all.loc[sve2_all['Hgtot ng/l'] > 100] = np.nan
这个警告是为了提醒你不要修改一个副本(这里 sve2_all[sve2_all[' Hgtot ng/l'] > 100]
可能是一个副本,如果真的是副本的话,任何修改都不会影响到原始的数据框。虽然在某些情况下它可能会正常工作,但 pandas 并不能保证在所有情况下都能正常工作……使用时请自行承担风险(算是给你提个醒! ;))。