You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何为MultiIndex列应用自定义排序(索引设置后执行)

按自定义顺序对MultiIndex列排序(转置后操作)

我来帮你搞定这个问题!你已经构建好了带双层列MultiIndex的DataFrame,现在需要对subcolumn_2按自定义顺序["B2","B1"]排序,而且要求必须在转置完成后操作,不能提前调整索引步骤,这个需求完全可以实现。

先重现你的DataFrame结构

首先我们先确认你的初始数据结构,确保和你描述的一致:

import pandas as pd

my_frame = pd.DataFrame(data={'a':[1,2,3,4],'b':[5,6,7,8],'c':[9,10,11,12], 'd':[13,14,15,16], 'subcolumn_1':['A1','A1','A2','A2'], 'subcolumn_2':['B1','B2','B1','B2']})
my_frame.set_index(keys=['subcolumn_1','subcolumn_2'], inplace=True)
my_frame = my_frame.transpose()

此时my_frame的结构如下:

subcolumn_1  A1     A2
subcolumn_2  B1  B2  B1  B2
a            1   2   3   4
b            5   6   7   8
c            9  10  11  12
d           13  14  15  16

实现自定义排序的解决方案

核心思路是:手动构建符合自定义顺序的列元组列表,然后用reindex方法重新排列DataFrame的列。这样完全不需要修改之前的索引/转置步骤,直接在最终的DataFrame上操作。

代码如下:

# 定义你的自定义排序顺序
custom_order = ["B2", "B1"]

# 生成新的列顺序:遍历每个subcolumn_1的唯一值,按custom_order拼接subcolumn_2
new_columns = [(level0, level1) for level0 in my_frame.columns.get_level_values(0).unique() 
               for level1 in custom_order]

# 按新列顺序重新索引DataFrame
my_frame_sorted = my_frame.reindex(columns=new_columns)

验证结果

打印排序后的my_frame_sorted,就能得到你想要的结构:

print(my_frame_sorted)

输出:

subcolumn_1  A1     A2
subcolumn_2  B2  B1  B2  B1
a            2   1   4   3
b            6   5   8   7
c           10   9  12  11
d           14  13  16  15

原理说明

  • 双层列MultiIndex本质是由元组组成的列表(比如[('A1','B1'), ('A1','B2'), ('A2','B1'), ('A2','B2')]
  • 我们通过列表推导式,为每个subcolumn_1的分组,按自定义顺序生成对应的subcolumn_2元组,确保顺序是B2在前,B1在后
  • reindex(columns=new_columns)会按照我们生成的新顺序重新排列列,完美匹配你的需求

这个方法不管subcolumn_1有多少个不同的分组,都能自动适配,而且完全符合你“在设置新索引后执行排序”的要求。

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

火山引擎 最新活动