如何使用Pandas sort_index为MultiIndex手动指定排序顺序?
可以通过Pandas的sort_index实现自定义MultiIndex排序
要实现手动指定两个层级的索引排序顺序,核心是先将索引转换为分类数据类型(Categorical),定义好自定义排序规则后,再调用sort_index()即可。具体操作步骤如下:
步骤1:定义自定义排序顺序
先明确两个索引层级的目标顺序:
- BU层级:
['Sales', 'Mfg', 'Acct'] - State层级:
['low', 'med', 'high']
步骤2:将MultiIndex转换为分类类型
把原DataFrame的MultiIndex的两个层级分别转为带有序规则的Categorical:
import pandas as pd # 构造示例DataFrame(匹配你提供的结构) data = { '2023': [1, 3, 5, 'a', 'c', 'e', 9, 7, 5], '2024': [2, 4, 6, 'b', 'd', 'f', 8, 6, 4] } index = pd.MultiIndex.from_tuples( [('Mfg', 'med'), ('Mfg', 'low'), ('Mfg', 'high'), ('Sales', 'med'), ('Sales', 'low'), ('Sales', 'high'), ('Acct', 'med'), ('Acct', 'low'), ('Acct', 'high')], names=['BU', 'State'] ) df = pd.DataFrame(data, index=index) # 定义自定义顺序 bu_order = ['Sales', 'Mfg', 'Acct'] state_order = ['low', 'med', 'high'] # 转换索引为分类类型 df.index = df.index.set_levels( [pd.Categorical(df.index.levels[0], categories=bu_order, ordered=True), pd.Categorical(df.index.levels[1], categories=state_order, ordered=True)] )
步骤3:调用sort_index完成排序
直接调用sort_index(),此时会按照我们定义的分类顺序对两个层级依次排序:
sorted_df = df.sort_index() print(sorted_df)
执行后输出的结果会完全符合需求:
2023 2024 BU State Sales low c d med a b high e f Mfg low 3 4 med 1 2 high 5 6 Acct low 7 6 med 9 8 high 5 4
补充说明
- 必须设置
ordered=True,这样Pandas才会将该分类视为有序类型,排序时遵循自定义顺序而非默认字典序。 - 如果后续需要调整排序规则,只需重新设置索引的levels为新的Categorical即可。
内容的提问来源于stack exchange,提问作者Chris Snow
相关产品推荐
相关产品推荐

