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 [重复]