如何对pandas多级索引DataFrame各组值排序并保留索引关联与顺序
MultiIndex DataFrame组内排序并保留索引关联的解决方案
问题描述
我有一个如下所示的pandas MultiIndex DataFrame,需要在保留索引关联关系与顺序的前提下,对每个顶层索引分组内的值进行排序。现有代码能实现单组排序,但无法将结果保存回原DataFrame,且inplace参数不起作用:
import pandas as pd df = pd.DataFrame([4,8,6,11,13,15], columns=['val'], index=[['A','A','A','B','B','B'],['a1','a2','a3','b1','b2','b3']]) # 原DataFrame输出: # val # A a1 4 # a2 8 # a3 6 # B b1 11 # b2 13 # b3 15 # 尝试的无效代码 for idx in df.index.unique(level=0): tmp = df.loc[idx].sort_values(by='val')
解决方法
方法1:使用groupby+apply生成新DataFrame(推荐)
通过groupby按顶层索引分组,对每组单独排序后自动拼接,完整保留MultiIndex结构:
df_sorted = df.groupby(level=0, group_keys=False).apply(lambda x: x.sort_values('val'))
执行后df_sorted的结果为:
val A a1 4 a3 6 a2 8 B b1 11 b2 13 b3 15
方法2:重新索引实现原地修改
如果需要直接修改原DataFrame,可以先收集所有排序后的完整索引,再通过reindex重排:
# 收集每组排序后的完整MultiIndex sorted_indices = [] for top_idx in df.index.unique(level=0): group = df.loc[top_idx] # 对当前组按val排序,取排序后的索引 sorted_group_indices = group.sort_values('val').index sorted_indices.extend(sorted_group_indices) # 重新索引原DataFrame,完成排序 df = df.reindex(sorted_indices)
原代码无效原因
原循环仅将单组排序结果赋值给临时变量tmp,未更新回原DataFrame;且df.loc[idx].sort_values(..., inplace=True)可能因df.loc[idx]返回的是数据副本而非视图,导致inplace修改无法作用到原DataFrame。
内容的提问来源于stack exchange,提问作者Pontis
相关产品推荐
相关产品推荐

