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?

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.


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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.