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

如何在Pandas DataFrame中通过映射实现按年份求平均体重?

解决方法:按出生年份计算平均体重

先拆解你代码里导致TypeError: unhashable type: 'DataFrame'的问题:

  • 字段名不匹配:你的DataFrame字段是Birthyear,但代码里写了set_index('Year')
  • 均值逻辑错误:df['Weight'].mean是引用方法本身而非计算结果,且你需要的是按年份分组的均值,不是全局均值
  • map参数错误:你传入的是DataFrame类型,但map需要的是键为年份、值为对应均值的Series,DataFrame属于不可哈希类型,因此触发报错
  • 浅拷贝问题:dfaverage = df是浅拷贝,修改dfaverage会直接改动原DataFrame,应该用df.copy()

推荐的几种实现方式

方式1:生成去重的「年份-平均体重」DataFrame

如果只需要每个年份对应的平均体重(一行对应一个年份),直接用groupby聚合即可:

# 按Birthyear分组计算Weight均值,重置索引并命名结果列
year_avg_df = df.groupby('Birthyear')['Weight'].mean().reset_index(name='Average_Weight')

方式2:为原数据每条记录添加对应年份的平均体重

如果需要保留原数据所有行,同时添加对应年份的平均体重列,用groupby + transform最简洁高效:

# 先拷贝原数据,避免修改原始DataFrame
dfaverage = df.copy()
# 按Birthyear分组后,将组内均值广播到每条记录
dfaverage['Average_Weight'] = dfaverage.groupby('Birthyear')['Weight'].transform('mean')

方式3:修正你的map思路实现

如果想保留map的写法,需先预先生成分组均值的Series,再用map匹配:

# 生成以Birthyear为索引、对应均值为值的Series
year_mean_series = df.groupby('Birthyear')['Weight'].mean()

dfaverage = df.copy()
# 用map匹配每个Birthyear对应的均值
dfaverage['Average_Weight'] = dfaverage['Birthyear'].map(year_mean_series)

以上方法都能高效处理10万行级别的数据,groupby是Pandas针对分组统计优化的原生方法,性能远优于手动循环或错误的map写法。

内容的提问来源于stack exchange,提问作者Tabare De Los Santos

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 13:55:08