You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 08:35:25