如何为多级索引DataFrame添加组首汇总行并排序子行?
问题:为MultiIndex DataFrame的每组添加汇总行并排序
原始数据与分组结果
import pandas as pd df = pd.DataFrame({ 'color': ['blue', 'grey', 'blue', 'grey', 'black'], 'name': ['pen', 'pen', 'pencil', 'pencil', 'box'], 'price':[2.5, 2.3, 1.5, 1.3, 5.2], 'bprice':[2.2, 2, 1.3, 1.2, 5.0] }) # 分组求和后的MultiIndex DataFrame a = df.groupby(['color', 'name'])[['price', 'bprice']].sum()
分组结果输出:
price bprice color name black box 5.2 5.0 blue pen 2.5 2.2 pencil 1.5 1.3 grey pen 2.3 2.0 pencil 1.3 1.2
期望输出
price bprice color name black * 5.2 5.0 box 5.2 5.0 blue * 4.0 3.5 pen 2.5 2.2 pencil 1.5 1.3 grey * 3.6 3.2 pen 2.3 2.0 pencil 1.3 1.2
需求
- 新增的
*汇总行需位于每组的第一行 - 除汇总行外,其余行按
price字段降序排序
解决方案
通过生成分组汇总行→合并数据→组内排序调整的流程实现,代码如下:
# 1. 按color分组生成汇总行,构建与原数据一致的MultiIndex summary = df.groupby('color')[['price', 'bprice']].sum() summary['name'] = '*' summary = summary.set_index('name', append=True) # 2. 合并原分组数据与汇总行,重置索引以便后续处理 combined = pd.concat([a, summary]).reset_index() # 3. 对每个color组内,将*行移到首位,其余行按price降序排序 result = combined.groupby('color', group_keys=False).apply( lambda g: pd.concat([g[g['name'] == '*'], g[g['name'] != '*'].sort_values(by='price', ascending=False)]) ).set_index(['color', 'name']) print(result)
代码说明
- 生成汇总行:按
color单独分组求和,给汇总行的name字段赋值*,并将其设置为索引的一部分,保证和原数据的MultiIndex结构一致。 - 合并数据:把原分组数据和汇总行合并,重置索引后便于后续的组内排序操作。
- 组内排序调整:对每个
color分组,先提取name为*的行放在组内最前面,剩余行按price降序排列,最后重新设置MultiIndex恢复原结构。
内容的提问来源于stack exchange,提问作者kevin h
相关产品推荐
相关产品推荐

