以前使用d = df[['a','b','c']]
d['a'] = 1这类,没有出现错误,突然一天报错
SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead
查了好久发现现在正确的打开方式为
d = df[['a','b','c']].copy()
d['a'] = 1
原文:http://sofasofa.io/forum_main_post.php?postid=1001449
如果你对原先的数据帧先进行切片或者索引,然后赋值,都会出现SettingWithCopyWarning。
情形一
d[d['col_1'] == 0]['col_2'] = 1
会出现警告
SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead
解决方法,
使用LOC或者ILOC
d.loc[d['col_1'] == 0, 'col_2'] = 1
情形二
先从原数据帧取出一个子数据帧,然后再对其中的元素赋值,例如
s = d[d['col_1'] == 0]
s.loc[:, 'col_2'] = 1
就会出现
SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead
解决方法,
对子datafame先进行复制,然后再赋值
s = d[d['col_1'] == 0].copy()
s.loc[:, 'col_2'] = 1