Classificação de índices múltiplos em pandas

88

Eu tenho um conjunto de dados com colunas de vários índices em um df do pandas que gostaria de classificar por valores em uma coluna específica. Tentei usar sortindex e sortlevel, mas não consegui obter os resultados que procuro. Meu conjunto de dados se parece com:

    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 

Quero classificar todos os dados e o índice pela coluna C no Grupo 1 em ordem decrescente para que meus resultados sejam semelhantes a:

    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 

É possível fazer essa classificação com a estrutura em que meus dados estão ou devo trocar o Grupo1 para o lado do índice?

MattB
fonte

Respostas:

129

Ao classificar por MultiIndex, você precisa conter a tupla que descreve a coluna dentro de uma lista *:

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

* para não confundir os pandas pensando que você deseja classificar primeiro por Grupo 1 e depois por C.


Observação: originalmente usado .sortdesde obsoleto e removido em 0,20, em favor de .sort_values.

Andy Hayden
fonte
Obrigado, exatamente o que eu estava procurando.
MattB
Hmmph. Mais rápido do que eu e uma solução melhor para inicializar.
DSM de
2
Exatamente o que eu precisava, obrigado. Isso não estava claro nos documentos (pelo menos eu não encontrei). Além disso, a mensagem de erro quando apenas definir o nível superior é enganosa: Cannot sort by duplicate column X.
Dr. Jan-Philip Gehrcke
Agradecimento extra por adicionar a explicação de por que devemos usar uma lista. Eu gostaria que o Pandas detectasse lista vs tupla e interpretasse uma tupla como uma seleção de coluna e não uma lista de colunas ...
Kaushik Ghose
5
@KaushikGhose que soa como poderia ser uma boa solicitação de recurso , acho que você pode usar loc:df.loc[('Group1', 'C')]
Andy Hayden