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 ......
在参数 key
和 DataFrame.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'
我想对具有字符串和整数组合的多索引级别进行排序。
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 ......
在参数 key
和 DataFrame.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'