pandas MultiIndex sort_index 字符串和整数组合未排序

pandas MultiIndex sort_index not ordered for string and int combo

我想对具有字符串和整数组合的多索引级别进行排序。

mux = pd.MultiIndex.from_arrays([
    list('aaaabbbbbccddddd'),
    ['t1','u','v','w','t12','u','v','w','t11','u','v','w','t4','u','v','w']
], names=['one', 'two'])

df = pd.DataFrame({'col': np.arange(len(mux))}, mux)
df.sort_index(level='two')

实际

预期

目标是订购 index_level 1 作为 t1,t4,t11,12,u ......

在参数 keyDataFrame.sort_values:

中使用自然排序
from natsort import index_natsorted
df = df.sort_values('two', key=lambda x: np.argsort(index_natsorted(x)))
print (df)
         col
one two     
a   t1     0
d   t4    12
b   t11    8
    t12    4
a   u      1
b   u      5
c   u      9
d   u     13
a   v      2
b   v      6
c   v     10
d   v     14
a   w      3
b   w      7
d   w     11
    w     15

您的解决方案可以按级别顺序排列,这里使用第二个级别 1:

from natsort import index_natsorted
df = df.sort_index(level=1, key=lambda x: np.argsort(index_natsorted(x)))
print (df)
         col
one two     
a   t1     0
d   t4    12
b   t11    8
    t12    4
a   u      1
b   u      5
c   u      9
d   u     13
a   v      2
b   v      6
c   v     10
d   v     14
a   w      3
b   w      7
d   w     11
    w     15

我也尝试按名称使用关卡,但似乎有问题:

from natsort import index_natsorted
df = df.sort_index(level='two', key=lambda x: np.argsort(index_natsorted(x)))
print (df)

>KeyError: 'Level two not found'