如何在Pandas多级索引DataFrame的各层级内按值排序?
Pandas多级索引DataFrame按一级索引分组内排序
环境
- Python 3.11.2
- Pandas 1.5.3
问题场景
有一个带pd.MultiIndex的DataFrame,需要在每个一级索引分组内按Feat_1列的值排序,而非对整个DataFrame做全局排序。示例数据如下:
import pandas as pd pf = pd.DataFrame({'Feat_1': {('A', 'aa'): 50, ('A', 'ab'): 85, ('A', 'ac'): 44, ('B', 'ba'): 31, ('B', 'bb'): 17, ('B', 'bc'): 32, ('C', 'ca'): 75, ('C', 'cb'): 33, ('C', 'cc'): 63},})
直接执行pf.sort_values('Feat_1')会打乱一级索引的分组结构,所有行按Feat_1全局排序,不符合分组内排序的需求。
解决方案
方法1:分组后应用排序
通过groupby按一级索引(level=0)分组,对每个分组单独执行排序,同时保留原多级索引结构:
sorted_pf = pf.groupby(level=0, group_keys=False).apply(lambda x: x.sort_values('Feat_1'))
方法2:重置索引后排序(性能更优)
先将多级索引转为普通列,排序完成后再恢复多级索引,这种写法在数据量大时性能更好:
sorted_pf = pf.reset_index().sort_values(['level_0', 'Feat_1']).set_index(['level_0', 'level_1'])
最终结果
执行上述任意一种方法后,都会得到符合需求的分组内排序结果:
Feat_1 A ac 44 aa 50 ab 85 B bb 17 ba 31 bc 32 C cb 33 cc 63 ca 75
内容的提问来源于stack exchange,提问作者Cy Bu
相关产品推荐
相关产品推荐

