You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 01:40:24