Multi-Index-Sortierung in Pandas

85

Ich habe einen Datensatz mit Spalten mit mehreren Indizes in einem Pandas df, den ich nach Werten in einer bestimmten Spalte sortieren möchte. Ich habe versucht, sortindex und sortlevel zu verwenden, konnte aber nicht die gewünschten Ergebnisse erzielen. Mein Datensatz sieht aus wie:

    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 

Ich möchte alle Daten und den Index nach Spalte C in Gruppe 1 in absteigender Reihenfolge sortieren, damit meine Ergebnisse wie folgt aussehen:

    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 

Ist es möglich, diese Sortierung mit der Struktur durchzuführen, in der sich meine Daten befinden, oder sollte ich Gruppe1 auf die Indexseite tauschen?

MattB
quelle

Antworten:

127

Wenn Sie nach einem MultiIndex sortieren, müssen Sie das Tupel enthalten, das die Spalte in einer Liste beschreibt *:

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

* Um Pandas nicht zu verwirren, dass Sie zuerst nach Gruppe1 und dann nach C sortieren möchten.


Hinweis: Ursprünglich verwendet, .sortda veraltet, dann in 0,20 entfernt, zugunsten von .sort_values.

Andy Hayden
quelle
Danke, genau das, wonach ich gesucht habe.
MattB
Hmmph. Schneller als ich und eine bessere Lösung zum Booten.
DSM
2
Genau das, was ich brauchte, danke. Das war aus den Dokumenten nicht klar (zumindest habe ich es nicht gefunden). Außerdem ist die Fehlermeldung, wenn nur die oberste Ebene definiert wird, irreführend : Cannot sort by duplicate column X.
Dr. Jan-Philip Gehrcke
Zusätzliche Dankbarkeit für das Hinzufügen der Erklärung, warum wir eine Liste verwenden müssen. Ich wünschte, Pandas würden Liste gegen Tupel erkennen und ein Tupel als Spaltenauswahl und nicht als Spaltenliste interpretieren ...
Kaushik Ghose
5
@KaushikGhose, die klingt wie eine gute Feature-Anfrage sein könnte , ich denke, Sie können loc verwenden:df.loc[('Group1', 'C')]
Andy Hayden