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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 05:54:14