Penyortiran Multi Indeks di Panda

88

Saya memiliki kumpulan data dengan kolom multi-indeks dalam df pandas yang ingin saya urutkan berdasarkan nilai di kolom tertentu. Saya telah mencoba menggunakan sortindex dan sortlevel tetapi belum mendapatkan hasil yang saya cari. Kumpulan data saya terlihat seperti:

    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 

Saya ingin mengurutkan semua data dan indeks menurut kolom C di Grup 1 dalam urutan menurun sehingga hasil saya terlihat seperti:

    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 

Apakah mungkin untuk melakukan pengurutan ini dengan struktur tempat data saya berada, atau haruskah saya menukar Grup1 ke sisi indeks?

MattB
sumber

Jawaban:

131

Saat menyortir berdasarkan MultiIndex Anda perlu memuat tupel yang menjelaskan kolom di dalam daftar *:

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

* agar tidak membingungkan panda dengan pemikiran bahwa Anda ingin mengurutkan terlebih dahulu berdasarkan Grup1, lalu C.


Catatan: Awalnya digunakan .sortsejak tidak digunakan lagi kemudian dihapus di 0.20, mendukung .sort_values.

Andy Hayden
sumber
Terima kasih, persis seperti yang saya cari.
MattB
Hmmph. Lebih cepat dari saya dan solusi yang lebih baik untuk boot.
DSM
2
Persis yang saya butuhkan, terima kasih. Itu tidak jelas dari dokumen (setidaknya saya tidak menemukannya). Juga, pesan kesalahan ketika hanya mendefinisikan tingkat atas adalah menyesatkan: Cannot sort by duplicate column X.
Dr. Jan-Philip Gehrcke
Terima kasih ekstra karena menambahkan penjelasan mengapa kita harus menggunakan daftar. Saya berharap Pandas akan mendeteksi daftar vs tupel dan menafsirkan tupel sebagai pemilihan kolom dan bukan daftar kolom ...
Kaushik Ghose
6
@Kikikosik kedengarannya seperti permintaan fitur yang bagus , saya kira Anda dapat menggunakan loc:df.loc[('Group1', 'C')]
Andy Hayden