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

使用pandas进行多列groupby遇错,需按日期与类别计算同类同日基金平均收益

报错根因

你编写的代码存在长度/索引不匹配的问题:
df.groupby(["category","date"])["fund_ret"].mean() 返回的是每个(日期、类别)分组对应1个平均值的聚合Series,行数远少于原表,且自带双层分组索引,和原DataFrame逐行对应的单层索引完全无法对齐,直接赋值给新列时会触发形状不匹配报错,或是生成大量无法对齐的空值。

正确实现代码

使用transform方法完成聚合结果的行级匹配:

df['benchmark_mean'] = df.groupby(["category", "date"])["fund_ret"].transform("mean")

transform的作用是:计算分组内的聚合值后,自动将结果按照原表的行顺序、行索引回填,让每一条基金记录都能拿到自己所属(日期+类别)分组的平均收益率,不会改变原表的行数和结构。

结果验证

对照你给出的示例数据,计算得到的基准收益率完全符合预期:

  • 2019-02、x类:仅包含AAA基金,平均收益率为0.05
  • 2019-02、y类:仅包含BBB基金,平均收益率为-0.01
  • 2019-03、x类:包含AAA(0.03)、CCC(0.02)两只基金,平均收益率为(0.03+0.02)/2=0.025,和你举的目标示例值一致
  • 2019-03、y类:仅包含BBB基金,平均收益率为0.07

补充场景说明:如果你不需要把平均值匹配回每一行基金记录,只是想生成独立的分组聚合结果表,可以用原始聚合写法搭配reset_index()实现:

# 生成独立的分组聚合表,每行对应一个(日期+类别)组合的平均收益率
agg_result = df.groupby(["category", "date"])["fund_ret"].mean().reset_index(name="benchmark_mean")

内容的提问来源于stack exchange,提问作者Clankk

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.24 08:54:09