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

如何为多级索引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)

代码说明

  1. 生成汇总行:按color单独分组求和,给汇总行的name字段赋值*,并将其设置为索引的一部分,保证和原数据的MultiIndex结构一致。
  2. 合并数据:把原分组数据和汇总行合并,重置索引后便于后续的组内排序操作。
  3. 组内排序调整:对每个color分组,先提取name为*的行放在组内最前面,剩余行按price降序排列,最后重新设置MultiIndex恢复原结构。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 13:10:20