如何使用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
相关产品推荐
相关产品推荐

