我有一个多索引数据框,我不想按字母顺序(轴= 1)对列进行排序,而是按自定义顺序排序。 我使用unstack来将df转换为多索引,并使用sort_index进行排序:
df = df.unstack().swaplevel(1,0, axis=1).sort_index(axis=1, level=0)
我希望我的指标列将按我的意愿而不是按字母排序,例如:椅子索引和表索引(以及更多)中的metric2,metric3,metric1。
dim3 chair table
metric1 metric2 metric3 metric1 metric2 metric3
dim1 dim2
a day1 1.0 10.0 123.0 NaN NaN NaN
b day2 NaN NaN NaN 2.0 20.0 456.0
请不要介意null,这只是一个例子。
答案 0 :(得分:1)
适应大熊猫documentation
import pandas as pd
import numpy as np
arrays = [['bar', 'bar', 'baz', 'baz', 'foo', 'foo', 'qux', 'qux'],
['one', 'two', 'one', 'two', 'one', 'two', 'one', 'two']]
tuples = list(zip(*arrays))
index = pd.MultiIndex.from_tuples(tuples, names=['first', 'second'])
df = pd.DataFrame(np.random.randn(3, 8), index=['A', 'B', 'C'], columns=index)
df
first bar baz foo qux \
second one two one two one two one
A 0.033707 0.681401 -0.999368 -0.015942 -0.417583 -0.233212 -0.072706
B 1.140347 -0.759089 -0.278175 -0.848010 -0.642824 -0.902858 0.117839
C -0.370039 -0.425074 -0.404409 -1.090386 -0.985019 -0.971178 0.924350
first
second two
A -0.850698
B 0.377443
C -1.129125
现在检查
df.columns.tolist()
[('bar', 'one'),
('bar', 'two'),
('baz', 'one'),
('baz', 'two'),
('foo', 'one'),
('foo', 'two'),
('qux', 'one'),
('qux', 'two')]
根据自己的喜好重新安排并使用.loc
df.loc[:,[('bar', 'one'),
('baz', 'one'),
('bar', 'two'),
('foo', 'one'),
('foo', 'two'),
('qux', 'two'),
('baz', 'two'),
('qux', 'one')
] ]
first bar baz bar foo qux baz \
second one one two one two two two
A 0.033707 -0.999368 0.681401 -0.417583 -0.233212 -0.850698 -0.015942
B 1.140347 -0.278175 -0.759089 -0.642824 -0.902858 0.377443 -0.848010
C -0.370039 -0.404409 -0.425074 -0.985019 -0.971178 -1.129125 -1.090386
first qux
second one
A -0.072706
B 0.117839
C 0.924350
这种方法应该给您最大程度的控制。
将这种方法适应您的数据框架,如下所示:
df = df.unstack().swaplevel(1,0, axis=1).loc[:, [('chair', 'metric2'),
('chair', 'metric3'), ('chair', 'metric1'),('table', 'metric2'),
('table', 'metric3'), ('table', 'metric1')]]