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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 05:22:32