Pandas如何按月份分组计算正确的月度加权平均值
Pandas 新增月度加权平均列实现方案
现有实现的核心问题
需要在DataFrame中新增列存储月度加权平均值,此前尝试的方案存在两处逻辑错误:
- 分组维度错误:未按月份维度聚合,直接按具体单日日期分组
- 权重计算错误:加权平均分母误用全量
Amount列总和,未使用对应月份分组内的Amount总和
校验示例:2021年3月仅存在1条数据,正确加权平均结果应为10(权重分母为当月Amount总和110),使用全量Amount总和作为分母的实现会输出偏差结果。
测试数据集共包含4个字段:
Date:日期字段Column 1:待计算加权均值的数值列Amount:权重列(Expected Output) Monthly WA:预期月度加权平均结果,其中2021年1月所有行预期值为16.78,2021年2月所有行预期值为20.09,2021年3月行预期值为10。
原有错误代码
def weight_avg(df, value, weights): x = df[value] y = df[weights] return (x*y).sum()/y.sum() df.groupby(df['Date']).apply(weight_avg, 'Column 1', 'Amount')
该代码除上述两个核心逻辑错误外,还未将聚合计算结果映射回原表对应行,无法直接生成符合要求的新列。
正确实现代码
import pandas as pd # 若Date列不是datetime格式,先执行格式转换,已转换可跳过 df['Date'] = pd.to_datetime(df['Date']) # 按年月分组计算加权平均,并映射回原表生成新列 month_groups = df.groupby(df['Date'].dt.to_period('M')) monthly_wa = month_groups.apply(lambda x: (x['Column 1'] * x['Amount']).sum() / x['Amount'].sum()) df['Monthly WA'] = df['Date'].dt.to_period('M').map(monthly_wa).round(2)
实现逻辑说明
- 分组键使用
dt.to_period('M')提取年月维度,替代原代码中直接使用单日日期分组的逻辑,保证聚合维度符合月度统计要求 - 加权平均计算完全在月度分组内完成:分子为分组内
Column 1与Amount的乘积和,分母为分组内Amount总和,避免了全量数据求和导致的权重偏差 - 计算得到各月加权均值后,通过
map方法将结果匹配到原表每一行,最终生成的Monthly WA列和预期结果完全一致:2021年1月值为16.78、2月值为20.09、3月值为10。
内容的提问来源于stack exchange,提问作者ross jim
相关产品推荐
相关产品推荐

