SettingWithCopyWarning,即使使用 loc (?) [重复]

Posted

技术标签:

【中文标题】SettingWithCopyWarning,即使使用 loc (?) [重复]【英文标题】:SettingWithCopyWarning, even when using loc (?) [duplicate] 【发布时间】:2014-07-04 11:52:54 【问题描述】:

如果我没想到会出现SettingWithCopyWarning 错误:

N.In <38>: # Column B does not exist yet
N.In <39>: df['B'] = df['A']/25
N.In <40>: df['B'] = df['A']/50

/Users/josh/anaconda/envs/py27/lib/python2.7/site-packages/pandas/core/indexing.py:389: 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

N.In <41>: df.loc[:,'B'] = df['A']/50

/Users/josh/anaconda/envs/py27/lib/python2.7/site-packages/pandas/core/indexing.py:389: 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

为什么会发生在案例 1 和 2 中?

【问题讨论】:

您需要在此之前显示代码(尽可能多) 谢谢@Jeff 我用前几行更新了 OP 在此之前添加;你以前在原地做一个操作 我一直不明白为什么需要这么复杂,因此创建了一个更简单的数据表库,tabel github.com/BastiaanBergman/tabel。对于简单的用例,它也更快。 【参考方案1】:

应该抑制警告的另一种解决方案:

df = df.copy()
df['B'] = df['A']/25
df['B'] = df['A']/50

【讨论】:

这确实有效。不完全了解这现在是更快还是更消耗内存。我不知道 copy() 命令的影响。因为实际上副本再次重新分配给 df.. 看起来最后没有任何改变。【参考方案2】:

在情况 1 中,df['A'] 会创建 df 的副本。正如Pandas documentation 所解释的,这可能会在链接时导致意外结果,因此会引发警告。案例 2 看起来是正确的,但也可能出现误报:

警告:链式赋值警告/异常旨在 通知用户可能无效的分配。可能有假 积极的;无意中链式分配的情况 报告。

要为单个数据框关闭SettingWithCopyWarning,请使用

df.is_copy = False

要完全关闭链式分配警告,请使用

options.mode.chained_assignment = None

【讨论】:

使用下面的like来禁用警告:pd.set_option('chained_assignment',None)

以上是关于SettingWithCopyWarning,即使使用 loc (?) [重复]的主要内容,如果未能解决你的问题,请参考以下文章

Python Pandas:即使使用 .loc 也无法撼动 SettingWithCopyWarning 错误

为预测集群创建一个新列:SettingWithCopyWarning

SettingWithCopyWarning 使用熊猫应用 [重复]

熊猫:SettingWithCopyWarning [重复]

熊猫:SettingWithCopyWarning 触发位置

实施列比较时的 SettingWithCopyWarning [重复]