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

如何重新排列pandas多层列索引(MultiIndex)DataFrame的列顺序?

重新排列MultiIndex DataFrame列顺序并赋值的正确方法

原DataFrame结构如下:

import pandas as pd

data = {
    ('A', 'u1'): [0.5083, 0.6748, 0.1753],
    ('A', 'u2'): [0.1007, 0.0354, 0.1013],
    ('A', 'u3'): [0.8001, 0.0076, 0.5231],
    ('B', 'y1'): [0.7373, 0.8421, 0.8060],
    ('B', 'y2'): [0.1387, 0.2670, 0.0040]
}
df = pd.DataFrame(data, index=[0.0, 0.1, 0.2])
df.index.name = 'Time'
df.columns.names = ['kind', 'names']

输出的DataFrame:

kind                            A               B
names          u1      u2      u3      y1      y2
Time
0.0        0.5083  0.1007  0.8001  0.7373  0.1387
0.1        0.6748  0.0354  0.0076  0.8421  0.2670
0.2        0.1753  0.1013  0.5231  0.8060  0.0040

需求是将kind='A'下的names顺序调整为u3、u2、u1,kind='B'保持不变,最终得到:

kind                            A               B
names          u3      u2      u1      y1      y2
Time
0.0        0.8001  0.1007  0.5083  0.7373  0.1387
0.1        0.0076  0.0354  0.6748  0.8421  0.2670
0.2        0.5231  0.1013  0.1753  0.8060  0.0040

之前尝试的错误方法

使用df.reindex(level="names", columns=["u3","u1"])只能提取指定列,无法保留其他列:

kind                    A      
names          u3      u1      
Time
0.0        0.8001  0.5083  
0.1        0.0076  0.6748  
0.2        0.5231  0.1753 

尝试df.loc[:,"A"] = df.reindex(level="names", columns=["u3","u1"])会导致u2列变为NaN,且顺序未正确替换:

kind                          A               B
names          u1    u2      u3      y1      y2
Time
0.0        0.5083   NaN  0.8001  0.7373  0.1387  
0.1        0.6748   NaN  0.0076  0.8421  0.2670
0.2        0.1753   NaN  0.5231  0.8060  0.0040  

正确解决方法

方法1:构造完整的列MultiIndex并重新索引

先构造目标列的完整顺序,然后直接对整个DataFrame重新索引:

# 构造目标列顺序:A类按u3、u2、u1,B类保持原顺序
target_columns = [
    ('A', 'u3'), ('A', 'u2'), ('A', 'u1'),
    ('B', 'y1'), ('B', 'y2')
]
df = df.reindex(columns=target_columns)

方法2:单独调整指定level的顺序,保留其他列

如果不想手动写全部列,可以先提取kind='A'的列,调整顺序后再和kind='B'的列拼接:

# 提取A类列并调整顺序
a_columns = df['A'].reindex(columns=['u3', 'u2', 'u1'])
# 提取B类列
b_columns = df['B']
# 拼接并重新赋值给原DataFrame
df = pd.concat([a_columns, b_columns], axis=1, keys=['A', 'B'])

关键原因说明

之前的错误在于df.loc[:,"A"]赋值时,右侧的DataFrame列顺序是u3、u1,而左侧的df["A"]列顺序是u1、u2、u3,pandas会按列名匹配赋值,导致u2没有对应值而变为NaN,且顺序并未改变。必须确保赋值时的列顺序完全匹配,或者直接重新构造整个列索引来覆盖原DataFrame。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 10:01:25