如何为pandas多级索引(multi index)DataFrame添加小计行并优化展示效果
实现方法说明
完全可以仅通过pandas实现该需求,核心思路是构造和原表索引结构对齐的小计行,按分组顺序拼接后利用pandas多级索引的自动合并特性实现美观的展示效果,示例代码如下:
1. 预处理原始数据
首先将原表的分类字段设置为多级索引,方便后续分组操作和自动合并展示:
import pandas as pd # 模拟你的原始数据 data = { 'Attribute 1': ['A', 'A', 'A', 'H', 'H', 'H', 'H'], 'Attribute 2': ['B', 'B', 'C', 'B', 'B', 'C', 'C'], 'Attribute 3': ['D', 'E', 'F', 'D', 'E', 'F', 'G'], 'Value': [10, 11, 12, 10, 11, 12, 15] } df = pd.DataFrame(data) # 设置三级多级索引,pandas展示时会自动合并重复的上层索引值 df = df.set_index(['Attribute 1', 'Attribute 2', 'Attribute 3'])
2. 构造小计行并拼接
按Attribute 1分组计算求和结果后,构造和原表索引结构完全对齐的小计行,再按分组顺序拼接:
# 计算分组求和结果 df_sum = df.groupby(level='Attribute 1').sum() # 构造结构匹配的小计行 subtotal_list = [] for attr1, sum_val in df_sum['Value'].items(): # 小计行的下层索引留空,上层索引填小计标识,保证结构和原表对齐 subtotal_list.append( pd.Series({'Value': sum_val}, name=(f'Subtotal for {attr1}', '', '')) ) df_subtotal = pd.DataFrame(subtotal_list) df_subtotal.index.names = ['Attribute 1', 'Attribute 2', 'Attribute 3'] # 按分组顺序拼接原数据和对应小计行 df_final = pd.concat([ pd.concat([group, df_subtotal.loc[[f'Subtotal for {attr1}']]]) for attr1, group in df.groupby(level='Attribute 1') ])
3. 输出结果
直接打印或者导出Excel即可得到你期望的效果,导出Excel时添加merge_cells=True参数可以保留合并单元格的样式:
# 控制台打印效果和你要求的完全一致 print(df_final) # 导出到Excel保留合并单元格样式 df_final.to_excel('result.xlsx', merge_cells=True)
内容的提问来源于stack exchange,提问作者Lê Hồng Nhật
相关产品推荐
相关产品推荐

