按列对数据框多索引级别进行排序 [英] Sort dataframe multiindex level and by column
问题描述
我为此感到挣扎,我怀疑还有更好的方法.如何按索引级别名称'idx_0',级别= 0和列'value_1'降序排列以下数据框,以使列'MyName'读取垂直的'SCOTTBOSTON'.
I have struggled with this and I suspect there is a better way. How do I sort the following dataframe by index level name 'idx_0', level=0 and by column, 'value_1' descending such that the column 'MyName' reads vertical '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)
我怀疑没有重置索引的简便方法
I suspect there is an easier way without resetting indexes
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也进行排序.
Sort by values first then sort index level=0, but level=1 get sorted also.
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再次变得混乱.
Sort by index level=0 then sort by values, but index=0 gets jumbled again.
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
推荐答案
以下是您需要的一些潜在解决方案:
Here are some potential solutions for your needs:
方法1:
(df.sort_values('value_1', ascending=False)
.sort_index(level=[0], ascending=[True]))
方法2:
(df.set_index('value_1', append=True)
.sort_index(level=[0,2], ascending=[True,False])
.reset_index('value_1'))
在pandas 0.22.0,Python 3.6.4上进行了测试
Tested on pandas 0.22.0, Python 3.6.4
这篇关于按列对数据框多索引级别进行排序的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!