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

Pandas生成透视表缺失分层汇总行 如何实现Excel默认格式效果?

实现方法

可以实现,Pandas原生支持生成和Excel透视表一致的多层级分类汇总效果,你现有代码的小问题是values参数里的列名和源数据不匹配,源数据投票数列是大写开头的Votes,注意先修正列名大小写。

方案1:手动逐层汇总拼接

适合层级固定的场景,逻辑直观可灵活调整:

import pandas as pd
import numpy as np

# 1. 最细粒度汇总(你已有结果:1st+2nd+3rd 三维度汇总)
level3 = df.groupby(["1st", "2nd", "3rd"], as_index=True)["Votes"].sum()

# 2. 二级分类汇总:1st+2nd 维度汇总
level2 = df.groupby(["1st", "2nd"], as_index=True)["Votes"].sum().reset_index()
level2["3rd"] = "小计" # 标记为二级汇总行
level2 = level2.set_index(["1st", "2nd", "3rd"])["Votes"]

# 3. 一级分类汇总:1st 维度汇总
level1 = df.groupby(["1st"], as_index=True)["Votes"].sum().reset_index()
level1["2nd"] = "小计"
level1["3rd"] = "小计"
level1 = level1.set_index(["1st", "2nd", "3rd"])["Votes"]

# 4. 可选添加全局总汇总,对应Excel透视表的总计行
total = pd.Series(
    [df["Votes"].sum()],
    index=pd.MultiIndex.from_tuples([("总计", "小计", "小计")], names=["1st", "2nd", "3rd"]),
    name="Votes"
)

# 合并所有层级后排序,最终结果和Excel默认透视表结构完全一致
pivot_with_subtotal = pd.concat([level3, level2, level1, total]).sort_index()

方案2:通用函数封装

适合任意层级行索引的透视表汇总,不需要重复写逐层计算逻辑:

def pivot_with_all_subtotals(df, index_cols, value_col, aggfunc=np.sum, total_name="总计", subtotal_label="小计"):
    all_dfs = []
    # 自动生成从最细粒度到最上层的所有层级汇总
    for i in range(len(index_cols), 0, -1):
        group_cols = index_cols[:i]
        sub = df.groupby(group_cols, as_index=True)[value_col].agg(aggfunc).reset_index()
        # 给当前层级缺少的索引字段填充小计标识
        for col in index_cols[i:]:
            sub[col] = subtotal_label
        sub = sub.set_index(index_cols)[value_col]
        all_dfs.append(sub)
    # 添加全局总汇总
    total = pd.Series(
        [df[value_col].agg(aggfunc)],
        index=pd.MultiIndex.from_tuples([(total_name,) + (subtotal_label,)*(len(index_cols)-1)], names=index_cols),
        name=value_col
    )
    all_dfs.append(total)
    # 合并排序后返回结果
    return pd.concat(all_dfs).sort_index()

# 调用示例,直接生成带全部分层汇总的透视表
pivot = pivot_with_all_subtotals(df, index_cols=["1st", "2nd", "3rd"], value_col="Votes")

如果需要把汇总行放在每个分组的顶部,只要把小计标签设置为排序优先级最高的字符即可,默认的字符串排序规则下,小计会排在字母内容之后,和Excel默认的汇总行在分组底部的效果一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 12:45:02