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.

TheChymera
sumber
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)  
CraigSF
sumber
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.

Karl Anka
sumber
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.

sameagol
sumber