Pandas按日期分组计算加权平均值报错KeyError: 'A'求解
问题解决:Pandas按日期分组计算加权平均值
报错原因分析
两段代码报错KeyError: 'A'的核心原因:
- 第一段代码中,
groupby('date')['A','B'].transform(lambda x: ...)会将lambda函数分别应用到'A'和'B'列的单个分组Series上,此时x是单列Series,不存在'A'键,因此触发KeyError。 - 第二段代码理论上
lambda x的参数是分组后的完整DataFrame,但直接用div关联groupby('date')['B'].agg('sum')会出现索引不匹配问题,且低版本Pandas可能对多列分组的transform逻辑支持不完善。
正确实现方式
方法1:用Transform生成广播列计算(简洁直观)
通过transform将分组聚合结果广播到每一行,再进行除法运算:
import pandas as pd # 生成每个分组的(A*B)总和,广播到该行所在分组的所有行 df['weighted_sum'] = df.groupby('date').transform(lambda g: (g['A'] * g['B']).sum()) # 生成每个分组的B列总和,同样广播到所有行 df['b_total'] = df.groupby('date')['B'].transform('sum') # 计算最终结果 df['result'] = df['weighted_sum'] / df['b_total']
方法2:先聚合再合并(大数据集更高效)
先计算每个日期分组的聚合值,再合并回原数据集,避免重复计算:
# 按日期分组计算两个关键指标 agg_df = df.groupby('date').agg( weighted_sum=('A', lambda x: (x * df.loc[x.index, 'B']).sum()), b_total=('B', 'sum') ) # 将聚合结果合并到原数据 df = df.merge(agg_df, on='date', how='left') # 计算最终结果 df['result'] = df['weighted_sum'] / df['b_total']
示例验证
假设测试数据如下:
df = pd.DataFrame({ 'date': ['2023-01-01', '2023-01-01', '2023-01-02', '2023-01-02'], 'A': [1, 2, 3, 4], 'B': [10, 20, 30, 40] })
运行代码后,result列结果为:
- 2023-01-01分组:
(1*10+2*20)/(10+20) ≈1.6667(两行均为此值) - 2023-01-02分组:
(3*30+4*40)/(30+40)≈3.5714(两行均为此值)
内容的提问来源于stack exchange,提问作者xyww
相关产品推荐
相关产品推荐

