Pandas操作警告:解决在DataFrame切片副本上设置值的问题
解决Pandas添加分组均值列的警告问题
警告根源
你触发警告的原因是用了adf['Average Speed'][x]这种链式索引写法,Pandas无法确定你操作的是原DataFrame的视图还是副本,所以抛出警告。而且用iterrows()循环逐行修改的方式效率极低,完全没必要。
正确实现方式(两种高效方案)
方案一:用groupby.transform()(最简洁)
直接通过分组转换,把每个Animal的MaxSpeed均值广播到对应行,一步生成新列:
import pandas as pd d = {'Animal': ['Parrot','Falcon','Parrot','Falcon'], 'MaxSpeed' : [56,360,58,380 ]} adf = pd.DataFrame(d) # 直接生成分组均值列 adf['Average Speed'] = adf.groupby('Animal')['MaxSpeed'].transform('mean')
方案二:用merge合并分组结果
先计算分组均值,再通过Animal列合并回原DataFrame:
import pandas as pd d = {'Animal': ['Parrot','Falcon','Parrot','Falcon'], 'MaxSpeed' : [56,360,58,380 ]} adf = pd.DataFrame(d) # 计算分组均值并重置索引,让Animal成为普通列 grp_spd = adf.groupby('Animal')['MaxSpeed'].mean().reset_index(name='Average Speed') # 合并到原DataFrame adf = adf.merge(grp_spd, on='Animal')
若坚持用循环(不推荐),消除警告的写法
如果一定要保留循环逻辑,把链式索引改成.loc的单步索引写法,就能避免警告:
import pandas as pd d = {'Animal': ['Parrot','Falcon','Parrot','Falcon'], 'MaxSpeed' : [56,360,58,380 ]} adf = pd.DataFrame(d) grp_spd = adf.groupby(by=['Animal']).mean() adf.insert(column='Average Speed', loc=2, value="") for x,y in adf.iterrows(): # 用.loc单步索引赋值,替代链式索引 adf.loc[x, 'Average Speed'] = grp_spd.loc[y.Animal].MaxSpeed
不过还是强烈建议用前两种向量化方法,循环在数据量大的时候会慢很多。
内容的提问来源于stack exchange,提问作者Silkograph
相关产品推荐
相关产品推荐

