Мультииндексная сортировка в пандах

88

У меня есть набор данных с многоиндексными столбцами в pandas df, который я хотел бы отсортировать по значениям в определенном столбце. Я пробовал использовать sortindex и sortlevel, но не смог получить требуемых результатов. Мой набор данных выглядит так:

    Group1    Group2
    A B C     A B C
1   1 0 3     2 5 7
2   5 6 9     1 0 0
3   7 0 2     0 3 5 

Я хочу отсортировать все данные и индекс по столбцу C в группе 1 в порядке убывания, чтобы мои результаты выглядели так:

    Group1    Group2
    A B C     A B C
 2  5 6 9     1 0 0
 1  1 0 3     2 5 7
 3  7 0 2     0 3 5 

Можно ли выполнить такую ​​сортировку со структурой, в которой находятся мои данные, или мне следует заменить Group1 на сторону индекса?

MattB
источник

Ответы:

129

При сортировке по MultiIndex вам необходимо содержать кортеж, описывающий столбец внутри списка *:

In [11]: df.sort_values([('Group1', 'C')], ascending=False)
Out[11]: 
  Group1       Group2      
       A  B  C      A  B  C
2      5  6  9      1  0  0
1      1  0  3      2  5  7
3      7  0  2      0  3  5

* чтобы не запутать панд и заставить их думать, что вы хотите отсортировать сначала по Group1, а затем по C.


Примечание. Первоначально использовалось .sortс момента устаревания, затем было удалено в версии 0.20 в пользу .sort_values.

Энди Хайден
источник
Спасибо, именно то, что я искал.
MattB 06
Хммм. Быстрее меня и лучшее решение для загрузки.
DSM
2
Именно то, что мне нужно, спасибо. Это не было ясно из документации (по крайней мере, я не нашел). Кроме того , сообщение об ошибке , когда только определение верхнего уровня вводит в заблуждение: Cannot sort by duplicate column X.
Доктор Ян-Филип Герке
Дополнительная благодарность за добавление объяснения того, почему мы должны использовать список. Я бы хотел, чтобы Pandas обнаруживал список и кортеж и интерпретировал бы кортеж как выбор столбца, а не как список столбцов ...
Каушик Гхос,
5
@KaushikGhose, похоже, может быть хорошим запросом функции , я думаю, вы можете использовать loc:df.loc[('Group1', 'C')]
Энди Хайден