如何按自定义参考列表对Pandas多级索引DataFrame的指定层级排序
解决方法
你可以通过将指定索引层级转换为有序分类类型,再调用sort_index实现自定义顺序排序,具体实现如下:
import pandas as pd import numpy as np import re # 原有复现代码 arrays = [["mylevelA_caseA__VAR_A", "mylevelA_caseC__VAR_B", "mylevelA_caseC__VAR_A", "mylevelA_caseB__VAR_B", "mylevelA_caseA__VAR_C", "mylevelA_caseB__VAR_C_D", "mylevelA_caseC__VAR_E", "mylevelA_caseD__VAR_A"], ["bar", "bar", "baz", "baz", "foo", "foo", "qux", "qux"], ["one", "two", "one", "two", "one", "two", "one", "two"]] df = pd.DataFrame(np.random.randn(8, 2), index=arrays,columns=['col1','col2']) df.index = pd.MultiIndex.from_tuples([re.split('__?',e[0], maxsplit=2)+list(e) for e in df.index]) # 自定义排序顺序 order_list = ['caseC', 'caseB', 'caseD', 'caseA'] # 第一步:先按列值排序 df = df.sort_values(df.columns.tolist()) # 第二步:将指定索引层级(case所在的level=1)转换为有序分类,顺序匹配order_list df.index = df.index.set_levels( pd.Categorical(df.index.levels[1], categories=order_list, ordered=True), level=1 ) # 第三步:按指定层级排序,sort_remaining=False保留同一case下的原有顺序 df = df.sort_index(level=1, sort_remaining=False)
实现原理
- 核心逻辑利用pandas分类数据的顺序特性,
pd.Categorical的categories参数直接定义排序优先级,sort_index会自动遵循分类的预设顺序排序,不需要依赖升降序参数。 sort_remaining=False保证同一case分组下的行顺序,和sort_values得到的顺序保持一致,符合需求。
内容的提问来源于stack exchange,提问作者rpb
相关产品推荐
相关产品推荐

