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

