如果df
是一个Pandas数据帧,行上有5级多索引,是否有一种不那么愚蠢的方法来实现由此产生的排序:
(df.sortlevel(3, sort_remaining=False)
.sortlevel(2, sort_remaining=False)
.sortlevel(0, sort_remaining=False)
.sortlevel(1, sort_remaining=False)
.sortlevel(4, sort_remaining=False))
注意:以下所有产生的顺序与上述表达式产生的顺序不同:
df.sortlevel([4, 1, 0, 2, 3], sort_remaining=False)
df.sortlevel([4, 1, 0, 2, 3], sort_remaining=True)
df.sortlevel([3, 2, 0, 1, 4], sort_remaining=False)
df.sortlevel([3, 2, 0, 1, 4], sort_remaining=True)
答案 0 :(得分:1)
是的!不要使用sortlevel
。将sort_index
与level=[4, 1, 0, 2, 3]
考虑数据框df
from string import ascii_uppercase
import pandas as pd
f = lambda n: np.random.choice(list(ascii_uppercase), n, False)
mux = pd.MultiIndex.from_product([f(2) for _ in range(5)])
df = pd.Series(range(32), mux, name='One').to_frame()
print(df)
One
T B W G U 0
P 1
M U 2
P 3
G G U 4
P 5
M U 6
P 7
V W G U 8
P 9
M U 10
P 11
G G U 12
P 13
M U 14
P 15
R B W G U 16
P 17
M U 18
P 19
G G U 20
P 21
M U 22
P 23
V W G U 24
P 25
M U 26
P 27
G G U 28
P 29
M U 30
P 31
然后排序
df.sort_index(level=[4, 1, 0, 2, 3])
One
R B G G P 21
V G G P 29
B G M P 23
V G M P 31
B W G P 17
V W G P 25
B W M P 19
V W M P 27
T B G G P 5
V G G P 13
B G M P 7
V G M P 15
B W G P 1
V W G P 9
B W M P 3
V W M P 11
R B G G U 20
V G G U 28
B G M U 22
V G M U 30
B W G U 16
V W G U 24
B W M U 18
V W M U 26
T B G G U 4
V G G U 12
B G M U 6
V G M U 14
B W G U 0
V W G U 8
B W M U 2
V W M U 10
由于您对所有级别进行了排序,因此无需sort_remaining=False