Pandas修改行部分值为行均值时出现SettingWithCopyWarning的解决方法
解决Pandas SettingWithCopyWarning警告的方案
你的代码触发警告的核心问题是链式索引操作——sample['marketcap'][1::]这种连续索引的方式,Pandas无法确定你修改的是原DataFrame的视图还是独立副本,所以抛出警告。
直接用以下两种方式修正即可:
方式一:用.loc显式定位赋值(推荐)
.loc是Pandas官方推荐的安全索引方式,能明确指定要修改的行和列,消除歧义:
# 复制marketcap列到新列10113 sample[10113] = sample['marketcap'].copy() # 计算索引1及之后的marketcap均值 marketcap_mean = sample.loc[1:, 'marketcap'].mean() # 用.loc赋值,避免链式索引 sample.loc[1:, 'marketcap'] = marketcap_mean
方式二:确保sample是独立副本(如果sample来自其他DF的切片)
如果你的sample是从另一个大DataFrame切片得到的(比如sample = df[df['some_col'] > 0]),它本质上是原DF的视图,先转成副本再操作:
# 先将sample转为独立副本,切断与原DF的关联 sample = sample.copy() # 后续操作和方式一一致 sample[10113] = sample['marketcap'].copy() marketcap_mean = sample.loc[1:, 'marketcap'].mean() sample.loc[1:, 'marketcap'] = marketcap_mean
原代码的错误在于连续使用方括号索引,这种操作可能导致Pandas无法追踪数据修改的源头,用.loc替代链式索引,或者提前转副本,就能彻底消除这个警告。
内容的提问来源于stack exchange,提问作者Waleed Ahmed
相关产品推荐
相关产品推荐

