如何在排序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
相关产品推荐
相关产品推荐

