Ubah Pandas Multi-Index menjadi kolom


156

Saya memiliki kerangka data dengan 2 level indeks:

                         value
Trial    measurement
    1              0        13
                   1         3
                   2         4
    2              0       NaN
                   1        12
    3              0        34 

Yang ingin saya ubah menjadi ini:

Trial    measurement       value

    1              0        13
    1              1         3
    1              2         4
    2              0       NaN
    2              1        12
    3              0        34 

Bagaimana saya bisa melakukan ini?

Saya memerlukan ini karena saya ingin menggabungkan data seperti yang diperintahkan di sini , tetapi saya tidak dapat memilih kolom saya seperti itu jika digunakan sebagai indeks.


2
Duplikat: stackoverflow.com/questions/18624039/… Anda menginginkan saran pertama. .reset_index()
TomAugspurger

1
banyak terima kasih, saya benar-benar melihat-lihat untuk ini banyak, tetapi "membuat multiindex ke kolom" dan pertanyaan serupa selalu membuat saya utas yang ingin memutar dataframe mereka ...
TheChymera

3
Selalu lebih mudah untuk menemukan jawaban ketika Anda sudah mengetahuinya :)
TomAugspurger

Jawaban:


194

The reset_index () adalah metode panda DataFrame yang akan mentransfer nilai-nilai indeks ke dalam DataFrame sebagai kolom. Pengaturan default untuk parameter adalah drop = False (yang akan menjaga nilai indeks sebagai kolom).

Yang harus Anda lakukan tambahkan .reset_index(inplace=True)setelah nama DataFrame:

df.reset_index(inplace=True)  

3
Untuk kasus saya di mana saya memiliki 3 level reset inplace indeks tidak bekerja. Alternatif sedang menetapkan kerangka data yang baru dipindahkan ke yang baru: df2 = df.reset_index ()
Gorkem

8
Untuk mereset hanya level tertentu, gunakandf.reset_index(level=[...])
cs95

20

Ini tidak benar-benar berlaku untuk kasus Anda tetapi bisa membantu orang lain (seperti saya 5 menit yang lalu) untuk mengetahuinya. Jika multindex seseorang memiliki nama yang sama seperti ini:

                         value
Trial        Trial
    1              0        13
                   1         3
                   2         4
    2              0       NaN
                   1        12
    3              0        34 

df.reset_index(inplace=True) akan gagal, karena kolom yang dibuat tidak dapat memiliki nama yang sama.

Maka Anda perlu mengganti nama multindex dengan df.index = df.index.set_names(['Trial', 'measurement'])untuk mendapatkan:

                           value
Trial    measurement       

    1              0        13
    1              1         3
    1              2         4
    2              0       NaN
    2              1        12
    3              0        34 

Dan kemudian df.reset_index(inplace=True)akan bekerja seperti pesona.

Saya mengalami masalah ini setelah pengelompokan berdasarkan tahun dan bulan pada kolom datetime (bukan indeks) yang disebut live_date, yang berarti bahwa tahun dan bulan dinamai live_date.


1
Bagaimana agar nilai-nilai Percobaan Anda terulang? Saya memiliki masalah yang sama dan berfungsi kecuali nilai-nilai saya tidak terulang.
Kaya

4

Seperti @ cs95 disebutkan dalam komentar, untuk menjatuhkan hanya satu level, gunakan:

df.reset_index(level=[...])

Ini menghindari keharusan mendefinisikan ulang indeks yang Anda inginkan setelah reset.

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.