Ordinamento di più indici in Panda


88

Ho un set di dati con colonne multi-indice in un df panda che vorrei ordinare per valori in una colonna specifica. Ho provato a usare sortindex e sortlevel ma non sono stato in grado di ottenere i risultati che stavo cercando. Il mio set di dati è simile a:

    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 

Voglio ordinare tutti i dati e l'indice per colonna C nel Gruppo 1 in ordine decrescente in modo che i miei risultati abbiano il seguente aspetto:

    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 

È possibile eseguire questo ordinamento con la struttura in cui si trovano i miei dati o dovrei scambiare il Gruppo1 sul lato indice?

Risposte:


131

Quando si ordina per MultiIndex è necessario contenere la tupla che descrive la colonna all'interno di un elenco *:

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

* per non confondere i panda facendogli pensare che vuoi ordinare prima per Gruppo1 poi per C.


Nota: utilizzato originariamente .sortpoiché deprecato, quindi rimosso in 0.20, a favore di .sort_values.


Grazie, esattamente quello che stavo cercando.
MattB

Hmmph. Più veloce di me e una soluzione migliore per l'avvio.
DSM

2
Esattamente quello di cui avevo bisogno, grazie. Non era chiaro dai documenti (almeno non l'ho trovato). Inoltre, il messaggio di errore quando solo la definizione del livello superiore è fuorviante: Cannot sort by duplicate column X.
Dr. Jan-Philip Gehrcke

Gratitudine extra per aver aggiunto la spiegazione del motivo per cui dobbiamo usare un elenco. Vorrei che i Panda rilevassero la lista rispetto alla tupla e interpretassero una tupla come una selezione di colonna e non un elenco di colonne ...
Kaushik Ghose

6
@KaushikGhose che suona come potrebbe essere una buona richiesta di funzionalità , immagino che tu possa usare loc:df.loc[('Group1', 'C')]
Andy Hayden
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.