#更新:pandas版本0.23.0通过按列和索引级别的组合排序解决了这个问题。
我一直在苦苦挣扎,但我怀疑有更好的方法。如何按索引级别名称“idx_0”,级别= 0和列“value_1”降序排序以下数据框,以使列“MyName”垂直读取“SCOTTBOSTON”。
import pandas as pd
import numpy as np
df = pd.DataFrame({'idx_0':[2]*6+[1]*5,
'idx_1':[6,4,2,10,18,5,11,1,7,9,3],
'value_1':np.arange(11,0,-1),
'MyName':list('BOSTONSCOTT')})
df = df.set_index(['idx_0','idx_1'])
df
输出:
MyName value_1
idx_0 idx_1
2 6 B 11
4 O 10
2 S 9
10 T 8
18 O 7
5 N 6
1 11 S 5
1 C 4
7 O 3
9 T 2
3 T 1
#使用以下预期输出:
df.sort_values(['value_1'], ascending=False)\
.reindex(sorted(df.index.get_level_values(0).unique()), level=0)
我怀疑有一种更简单的方式,而不需要重置索引。
MyName value_1
idx_0 idx_1
1 11 S 5
1 C 4
7 O 3
9 T 2
3 T 1
2 6 B 11
4 O 10
2 S 9
10 T 8
18 O 7
5 N 6
失败 #1:
df.sort_values('value_1', ascending=False).sort_index(level=0)
首先按照值排序,然后按照索引级别0排序,但是级别1也会被排序。
MyName value_1
idx_0 idx_1
1 1 C 4
3 T 1
7 O 3
9 T 2
11 S 5
2 2 S 9
4 O 10
5 N 6
6 B 11
10 T 8
18 O 7
失败 #2
df.sort_index(level=0).sort_values('value_1', ascending=False)
按照索引级别为0进行排序,然后按值排序,但索引为0的部分会再次混乱。
MyName value_1
idx_0 idx_1
2 6 B 11
4 O 10
2 S 9
10 T 8
18 O 7
5 N 6
1 11 S 5
1 C 4
7 O 3
9 T 2
3 T 1
df.reset_index(level=0).sort_values(['idx_0','value_1'], ascending=[1,0]).set_index('idx_0', append=True).swaplevel()
,但是你的版本看起来更好... - MaxU - stand with Ukraine