熊猫:SettingWithCopyWarning [重复]

Posted

技术标签:

【中文标题】熊猫:SettingWithCopyWarning [重复]【英文标题】:Pandas: SettingWithCopyWarning [duplicate] 【发布时间】:2014-05-25 00:41:34 【问题描述】:

我想用NaN 替换大于任意数字(本例中为100)的PandasDataFrame 中的值(因为如此大的值表示实验失败)。以前我用它来替换不需要的值:

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 中的一些值吗?

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

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

【参考方案2】:

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

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

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

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

【讨论】:

我用同样的方法替换了单个列,对于 df.loc 我也收到了这个警告。【参考方案3】:

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

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

【讨论】:

您可以检查索引中是否存在 True 值,然后应用替换 if (myindex==True).sum()>0: df_train.loc[myindex, c] = 0【参考方案4】:

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

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

【讨论】:

以上是关于熊猫:SettingWithCopyWarning [重复]的主要内容,如果未能解决你的问题,请参考以下文章

熊猫:SettingWithCopyWarning 触发位置

为啥我从熊猫那里得到 SettingWithCopyWarning

熊猫 SettingWithCopyWarning 的操作

尝试 .loc 后的熊猫 SettingWithCopyWarning

Python:SettingWithCopyWarning:试图在 DataFrame 中的切片副本上设置值

熊猫:链式作业[重复]