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

如何在排序Pandas多级索引DataFrame时指定特定层级排序规则

多级索引DataFrame自定义排序需求

我有一个带多级索引的pandas DataFrame,希望对索引进行升序排序,但最外层的level_1层级需要例外,按照["B", "A", "C"]的特定顺序排列。

示例代码

import pandas as pd
import numpy as np

# 创建多级索引
index = pd.MultiIndex.from_tuples([
    ('B', 'Y', 'II', 'D'),
    ('A', 'X', 'I', 'A'),
    ('C', 'Z', 'II', 'B'),
    ('A', 'Y', 'I', 'B'),
    ('C', 'X', 'I', 'A')
], names=['level_1', 'level_2', 'level_3', 'level_4'])

# 生成随机数据创建DataFrame
data = np.random.randint(0, 10, (5, 2))
df = pd.DataFrame(data, index=index, columns=['column1', 'column2'])

print(df)

当前输出示例

column1  column2
level_1 level_2 level_3 level_4                  
B       Y       II      D              1        7
A       X       I       B              9        4
C       Z       I       B              5        3
A       Y       I       A              2        4
C       X       II      A              9        2

期望结果

column1  column2
level_1 level_2 level_3 level_4                  
B       Y       II      D              1        7
A       X       I       B              9        4
A       Y       I       A              2        4
C       X       II      A              9        2
C       Z       I       B              5        3

解决方案

可以通过将level_1转换为有序分类类型来实现自定义排序,再结合sort_index方法完成剩余层级的升序排序:

# 给level_1指定自定义顺序的有序分类
df.index = df.index.set_levels(
    pd.Categorical(df.index.get_level_values('level_1'), 
                   categories=["B", "A", "C"], 
                   ordered=True),
    level='level_1'
)

# 排序:先按level_1的自定义顺序,剩余层级默认升序
df_sorted = df.sort_index()

print(df_sorted)

代码说明

  • pd.Categorical:将level_1的取值转换为有序分类,指定categories为自定义顺序["B", "A", "C"],并设置ordered=True让分类具备排序优先级。
  • sort_index():默认会按所有层级排序,由于level_1已经是有序分类,会先按自定义顺序排列,其余层级则按默认的升序规则排序。

内容的提问来源于stack exchange,提问作者Andi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 03:32:45