Sortowanie według wielu indeksów w pandach

88

Mam zestaw danych z kolumnami z wieloma indeksami w pandas df, który chciałbym posortować według wartości w określonej kolumnie. Próbowałem użyć sortindex i sortlevel, ale nie udało mi się uzyskać wyników, których szukam. Mój zbiór danych wygląda następująco:

    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 

Chcę posortować wszystkie dane i indeks według kolumny C w grupie 1 w porządku malejącym, aby moje wyniki wyglądały następująco:

    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 

Czy można to zrobić ze strukturą, w której znajdują się moje dane, czy powinienem zamienić grupę Group1 na stronę indeksu?

MattB
źródło

Odpowiedzi:

129

Podczas sortowania według MultiIndex musisz zawrzeć krotkę opisującą kolumnę wewnątrz listy *:

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

* aby nie mylić pandy w myśleniu, że chcesz sortować najpierw według Grupy 1, a następnie według C.


Uwaga: pierwotnie używany .sortod czasu wycofania, a następnie usunięcia w wersji 0.20 na rzecz .sort_values.

Andy Hayden
źródło
Dzięki, dokładnie to, czego szukałem.
MattB,
Hmmph. Szybszy niż ja i lepsze rozwiązanie do rozruchu.
DSM,
2
Dokładnie to, czego potrzebowałem, dzięki. To nie było jasne od doktorów (przynajmniej ja tego nie znalazłem). Również komunikat o błędzie, gdy tylko określenie poziomu górny jest mylące: Cannot sort by duplicate column X.
Dr Jan-Philip Gehrcke
Dodatkowa wdzięczność za dodanie wyjaśnienia, dlaczego musimy użyć listy. Życzę Pandy będzie wykryć listy vs krotki i krotka interpretować jako kolumny wybrać, a nie listę kolumn ...
Kaushik Ghose
5
@KaushikGhose, które brzmi jak może być dobrym żądaniem funkcji , myślę, że możesz użyć loc:df.loc[('Group1', 'C')]
Andy Hayden