如何在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
相关产品推荐
相关产品推荐

