Обновлено: версия 0.23.0 для панд решает эту проблему с
Сортировка по комбинации столбцов и уровней индекса
Я боролся с этим и подозреваю, что есть лучший способ. Как отсортировать следующий фрейм данных по имени уровня индекса 'idx_0', level = 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)
Сортировка сначала по значениям, а затем сортировка индекса level = 0, но также сортируются level = 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