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 question看来,有时可以忽略此警告,但我无法很好地遵循讨论以确定这是否适用于我的情况。警告基本上是让我知道我将覆盖 my 中的一些值DataFrame吗?

编辑:据我所知,一切正常。作为后续,我替换值的方法是非标准的吗?有没有更好的方法来替换值?

4

4 回答 4

24

正如错误消息中所建议的,您应该使用 loc 来执行此操作:

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

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

于 2014-04-11T06:56:40.990 回答
4

我在尝试重置整个 DataFrame 的内容时收到此警告,但无法使用locor解决它iloc

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

但是解决作为数据包含的 ndarray 解决了这个问题:

df.values[:, :] = new_values # no warnings and desired behavior
于 2015-01-17T02:38:46.623 回答
2

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

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

于 2016-07-08T18:25:11.177 回答
1

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

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

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

请记住,如果您在创建数据透视表时遇到问题(pivot_tablerow关键字不受支持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

于 2016-01-04T22:27:53.233 回答