如何在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
相关产品推荐
相关产品推荐

