SettingWithCopyWarning,即使使用loc(?)

Ame*_*ina 11 python pandas

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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

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

kxs*_*ong 11

在案例1中,df['A']创建一个副本df.正如Pandas文档所解释的那样,这可能会在链接时导致意外结果,从而引发警告.案例2看起来正确,但可能出现误报:

警告:链式分配警告/异常旨在通知用户可能无效的分配.可能存在误报; 无意中报告链式作业的情况.

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

df.is_copy = False
Run Code Online (Sandbox Code Playgroud)

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

options.mode.chained_assignment = None
Run Code Online (Sandbox Code Playgroud)


Cha*_*ley 5

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

df = df.copy()
df['B'] = df['A']/25
df['B'] = df['A']/50
Run Code Online (Sandbox Code Playgroud)

  • 这确实有效。不完全理解这现在是更快还是更多的内存消耗。我不知道 copy() 命令的影响。由于实际上该副本再次重新分配给 df .. 看起来最后没有任何更改。 (2认同)