如何重新排列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
相关产品推荐
相关产品推荐

