问题
操作 DataFrame 的时候有时会报SettingwithCopyWarning的警告,如下图:
然后吧,你按着他的提示,尝试改用.loc,结果还是没卵用。最后由于懒得检查,索性直接关闭所有警告信息:
import warnings
warnings.filterwarnings("ignore")
警告虽不是错误,但直接关闭警告肯定是不对。警告的作用就是告诉你虽然代码语法正确,但也会出现潜在的错误或问题。
原因
导致这条告警产生的原因,是由于pandas无法判断对原始DataFrame进行切片,产生的是视图还是副本。如果切片产生的是视图,则赋值操作会修改原始DataFrame,如果产生的是副本,则不会修改原始的DataFrame。
看下面代码演示:
df = pd.DataFrame(np.arange(4*5).reshape(4, 5))
df # 这是原始的DataFrame
下面的操作就会报错:
# 这是一个切片视图
view_df = df.iloc[:,3:4]
# 对视图修改时就会报错
view_df.iloc[2:3,:]=0
解决方案
下面操作就是正确的:
# 这是一个切片副本
copy_df = df.iloc[:,3:4].copy() # copy一个副本
# 对副本修改时就不会报错
copy_df.iloc[2:3,:]=0