Pandas多层索引下如何计算每日各分类Price(USD)占当日总额百分比
解决方案
你已经完成了「日期+分类」维度的金额聚合,只需要基于日期维度计算单日总金额,再做逐行比值即可,两种可直接运行的实现方式如下:
方式一:单步聚合同时计算占比(推荐)
不需要先生成多层索引的聚合结果,直接在分组时同步计算占比,逻辑更简洁:
# 先聚合得到每个日期下各分类的总金额 df_agg = df.groupby(["Timestamp", "Category"], as_index=False)["Price(USD)"].sum() # 按日期分组,用transform匹配每行对应日期的总金额,直接计算占比 df_agg["Percentage"] = df_agg["Price(USD)"] / df_agg.groupby("Timestamp")["Price(USD)"].transform("sum")
如果你需要保留多层索引结构,删除as_index=False参数即可,计算逻辑不受影响。
方式二:基于现有多层索引结果计算
如果你已经生成了多层索引的聚合结果df3,不需要重置索引,直接按索引的Timestamp层级分组计算即可:
# level=0对应多层索引中的Timestamp层级,除法会自动按索引匹配日期总金额 df3["Percentage"] = df3["Price(USD)"] / df3.groupby(level=0)["Price(USD)"].sum()
计算规则匹配说明
以你给出的示例数值验证:
同一日期下三个分类金额为0.3、0.2、0.1,当日总金额为0.3+0.2+0.1=0.6,运行代码后三个分类的占比分别为0.3/0.6=0.5、0.2/0.6≈0.333、0.1/0.6≈0.167,完全符合预期计算逻辑。
提示:如果数据中存在单日总金额为0的异常情况,上述计算会触发除零警告,可以提前过滤金额为0的记录,或者用
div方法设置异常填充值。
内容的提问来源于stack exchange,提问作者Crimson_91
相关产品推荐
相关产品推荐

