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

如何使用pandas对多层索引透视表按分组规则降序排序

pandas多层索引透视表两层降序排序方案

问题场景

基于如下代码构造测试数据并生成多层索引透视表后,需要实现两层自定义降序排序:

  • 第一层索引B:按每个B分组下C列的总和降序排列,总和高的分组整体靠前
  • 第二层索引A:在每个B分组内部,按C列的数值本身降序排列

初始构造数据与透视表代码:

import pandas as pd
import numpy as np

df = pd.DataFrame({'A': ['John', 'Boby', 'Mina', 'Peter', 'Nicky'],
      'B': ['Pune', 'Mumbai', 'Pune', 'Mumbai', 'Pune'],
      'C': [27, 23, 21, 25, 24]})

table = pd.pivot_table(df, values ='C', index =['B', 'A'], aggfunc = np.sum)

初始透视表默认按索引字典序排列,结果如下:

C
B      A         
Mumbai Boby    23
       Peter   25
Pune   John    27
       Mina    21
       Nicky   24

实现代码

不需要重置索引,直接通过自定义排序键即可完成两层排序,代码兼容B列存在任意数量不同取值的场景:

# 生成第一层排序权重:映射每行对应B分组的C列总和
b_level_sort_key = table.groupby(level='B')['C'].transform('sum')
# 按两层规则依次降序排序
sorted_table = table.sort_values(by=[b_level_sort_key, 'C'], ascending=[False, False])

排序结果

运行代码后得到的结果完全符合预期:

C
B      A        
Pune   John   27
       Nicky  24
       Mina   21
Mumbai Peter  25
       Boby   23

逻辑说明

  • 第一层排序逻辑:通过groupby(level='B')按第一层索引分组计算C列总和,transform方法会将分组总和按行映射回原表,保证同属一个B组的行拥有相同的排序权重,按该权重降序即可让总和更高的B组排在前面。
  • 第二层排序逻辑:直接使用C列值作为第二排序键,排序时会在同权重的B组内部自动按C列值降序排列,实现组内顺序调整。
  • 整个排序过程保留原有多层索引结构,无需额外做索引重置、重建的冗余操作。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 09:42:25