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)
另一个应该抑制警告的解决方案:
df = df.copy()
df['B'] = df['A']/25
df['B'] = df['A']/50
Run Code Online (Sandbox Code Playgroud)