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

如何在pandas透视表中聚合子类别并显示父类别总计

问题描述

我创建了一个pivot_table,用于统计A-K类及其子类别(A1-A12等)的拒绝总数,代码如下:

piv_table2 = df.loc[(Filter1) & (Filter2)].pivot_table(
    values=["Level3"], 
    index=["Level1", "Level2"], 
    columns=None,
    aggfunc="count",
    margins=True,
    margins_name="Total"
)

输入DataFrame示例:

WeekNumber, Level1, Level2, Level3
22, H, H1, Obs
22, H, H2, Exc
23, B, B10, Obs
23, A, A6, Obs

其中WeekNumber为周数,Level1是高级类别,Level2是子类别,Level3为"Obs"或"Exc"。当前pivot_table输出仅显示子类别计数和全部总计,期望输出能同时显示每个Level1(如A、K等)的总计,格式如下:

# Desired Output with Level1 Totals & Complete Totals
                Level3
Level1  Level2  
A -             617 
        A1-     175
        A10-    2
        A11-    10
        A12-    30
...
K -             12  
        K1 -    10
        K11 -   1
        K11 -   1
Total           5170

尝试使用merge方法合并透视表但未成功,请问如何实现该需求?

解决方案

可以通过分组统计+合并数据+调整索引的方式实现,具体操作如下:

  • 筛选目标数据并统计子类别(Level1+Level2)的计数
    # 筛选符合条件的数据
    filtered_df = df.loc[(Filter1) & (Filter2)]
    
    # 统计每个子类别(Level1+Level2)的Level3数量
    subcat_counts = filtered_df.groupby(["Level1", "Level2"])["Level3"].count().rename("Level3")
    
  • 统计每个Level1级别的总计
    # 统计Level1的总计,将Level2设为占位符"-"
    level1_totals = filtered_df.groupby("Level1")["Level3"].count().reset_index()
    level1_totals["Level2"] = "-"
    level1_totals = level1_totals.set_index(["Level1", "Level2"])["Level3"]
    
  • 合并统计结果并排序
    # 合并Level1总计和子类别计数,按索引排序保证同一Level1的内容在一起
    combined = pd.concat([level1_totals, subcat_counts]).sort_index()
    
  • 添加全局总计
    # 计算全局总计并追加到结果末尾
    grand_total = pd.Series(combined.sum(), index=pd.MultiIndex.from_tuples([("Total", "")]), name="Level3")
    final_result = pd.concat([combined, grand_total])
    

若需要保留DataFrame格式,可将结果转换为DataFrame:

final_result = final_result.to_frame()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 14:16:29