使用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
相关产品推荐
相关产品推荐

