Pandas多索引DataFrame按组排序时如何保留一级索引结构?
实现方案
核心逻辑无需循环,通过两步操作即可在完整保留一级索引分组、不打乱二级索引原有顺序的前提下,按一级索引的Column 1分组和完成排序:
- 利用
groupby(level=0)对一级索引分组,通过transform计算每个组的Column 1求和值,将组级别的求和值映射回原表的每一行,生成全组一致的排序键 - 直接用该排序键对全表做排序,由于同组所有行的排序键值完全相同,排序时同组会自动聚合为连续块;同时pandas的稳定排序特性会保留同组内行的原有相对顺序,不会打乱二级索引的层级结构
完整可运行代码:
import pandas as pd data = { 'Column 1': [1., 2., 3., 4.,34,2,5,6], 'Index1 Title': [ "Apples", "Apples", "Puppies", "Puppies", 'Oranges','Oranges','Blue berries','Blue berries'], 'index2 Title': [ 'Inside', 'Outside', 'Inside', 'Outside', 'Inside', 'Outside', 'Inside', 'Outside' ] } df = pd.DataFrame(data) df.set_index(['Index1 Title','index2 Title'],inplace=True) # 计算每个一级索引组的Column1总和,生成行级别的排序键 group_sort_key = df.groupby(level=0)['Column 1'].transform('sum') # 按排序键降序排列,自动保持同组聚合、组内顺序不变 sorted_df = df.sort_values(by=group_sort_key, ascending=False)
执行代码后得到的输出完全匹配预期效果:
Index1 Title index2 Title Column 1 Oranges Inside 34.0 Outside 2.0 Blue berries Inside 5.0 Outside 6.0 Puppies Inside 3.0 Outside 4.0 Apples Inside 1.0 Outside 2.0
之前直接执行
df.sort_values('Column 1', ascending=False)时,排序依据是行级别的分散数值,同组的行因为数值差异会被打散到不同位置;而本次使用的排序键是组级别的固定值,同组所有行的排序优先级完全一致,因此不会出现分组被拆分的问题。
相比手动reset_index后做多字段排序的方案,上述方法不需要额外增删临时列,也不会破坏原有多索引的结构,操作更简洁。
内容的提问来源于stack exchange,提问作者Sofiane
相关产品推荐
相关产品推荐

