【问题标题】:SettingWithCopyWarning, even when using loc (?) [duplicate]SettingWithCopyWarning,即使使用 loc (?) [重复]
【发布时间】: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。对于简单的用例,它也更快。

标签: python pandas


【解决方案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)
猜你喜欢
  • 2020-03-28
  • 2018-09-11
  • 2021-11-30
  • 2014-10-18
  • 1970-01-01
相关资源
最近更新 更多