已启用margins参数的Pandas多级索引透视表如何添加区域小计
解决Pandas透视表添加区域小计的问题
我来帮你搞定这个问题~你之前的代码之所以会出现两列,是因为用来合并的region_total是一个Series(默认列名是0),而你的pop_table是一个DataFrame(列名是pop99),两者concat时就会保留各自的列,导致出现两列。另外,你构造的MultiIndex用了空字符串作为departement值,虽然结构没问题,但显示和索引排序的逻辑不够直观。
正确的解决方案步骤:
我们需要保证小计数据和原透视表的结构完全一致(相同的MultiIndex、相同的列名),再进行合并:
生成区域小计数据:
先通过groupby计算每个region的pop99总和,然后给小计行的departement字段设置一个明确的标识(比如"Total"),再转换成和原透视表一样的MultiIndex结构:import pandas as pd # 生成区域小计,保持和原表一致的结构 region_totals = df.groupby("region")["pop99"].sum().reset_index() region_totals["departement"] = "Total" # 给小计行的departement命名 region_totals.set_index(["region", "departement"], inplace=True)合并原表和小计数据并排序:
现在region_totals和pop_table结构完全匹配,concat后只会保留pop99一列,再通过排序让小计行显示在对应region的最后:# 合并并排序索引 combined_table = pd.concat([pop_table, region_totals]).sort_index(level=["region", "departement"])
最终效果示例:
你会得到这样的结果,每个region下面先显示各个departement的数值,最后跟着该region的Total行,且只有pop99一列:
pop99 region departement AL 67 1026120 68 708025 Total 1734145 AQ 24 388293 33 1287334 40 327334 Total 2002961 ... ... ... RA 38 1094006 42 728524 69 1578869 73 373258 74 631679 Total 5645399
额外小技巧:
如果想让Total行在每个region的最上方,可以调整排序逻辑,或者在构造region_totals时给departement设置一个比所有数值型departement更小的值(比如"00_Total"),这样排序时会排在前面。
内容的提问来源于stack exchange,提问作者Dorian Godefroy
相关产品推荐
相关产品推荐

