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

已启用margins参数的Pandas多级索引透视表如何添加区域小计

解决Pandas透视表添加区域小计的问题

我来帮你搞定这个问题~你之前的代码之所以会出现两列,是因为用来合并的region_total是一个Series(默认列名是0),而你的pop_table是一个DataFrame(列名是pop99),两者concat时就会保留各自的列,导致出现两列。另外,你构造的MultiIndex用了空字符串作为departement值,虽然结构没问题,但显示和索引排序的逻辑不够直观。

正确的解决方案步骤:

我们需要保证小计数据和原透视表的结构完全一致(相同的MultiIndex、相同的列名),再进行合并:

  1. 生成区域小计数据:
    先通过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)
    
  2. 合并原表和小计数据并排序:
    现在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 11:04:09