Jika saya punya indeks kolom multi-level:
>>> cols = pd.MultiIndex.from_tuples([("a", "b"), ("a", "c")])
>>> pd.DataFrame([[1,2], [3,4]], columns=cols)
Sebuah --- + - b | c - + --- + - 0 | 1 | 2 1 | 3 | 4
Bagaimana saya bisa menurunkan level "a" dari indeks itu, jadi saya berakhir dengan:
b | c - + --- + - 0 | 1 | 2 1 | 3 | 4
droplevel
bekerja dapat bekerja pada indeks atau kolom bertingkat baik melalui parameteraxis
.Jawaban:
Anda bisa menggunakan
MultiIndex.droplevel
:sumber
>>> df.columns = df.columns.droplevel(0)
>>> df.index = df.index.droplevel(1)
df.columns.droplevel()
tidak lagi tersedia.>>>df.columns = df.columns.droplevel(2) >>>df.columns = df.columns.droplevel(0)
Cara lain untuk menjatuhkan indeks adalah dengan menggunakan pemahaman daftar:
Strategi ini juga berguna jika Anda ingin menggabungkan nama-nama dari kedua level seperti pada contoh di bawah ini di mana level bawah berisi dua 'y:
Menjatuhkan level atas akan meninggalkan dua kolom dengan indeks 'y'. Itu bisa dihindari dengan bergabung dengan nama-nama dengan daftar pemahaman.
Itu masalah yang saya miliki setelah melakukan groupby dan butuh beberapa saat untuk menemukan pertanyaan lain yang menyelesaikannya. Saya menyesuaikan solusi itu dengan kasus spesifik di sini.
sumber
[col[1] for col in df.columns]
lebih langsungdf.columns.get_level_values(1)
.[col[0] if col[1] == '' else col[1] for col in df.columns]
Cara lain untuk melakukan ini adalah dengan menetapkan kembali
df
berdasarkan bagian melintangdf
, menggunakan metode .xs .sumber
b
) lalu jatuhkan tingkat itu dan dibiarkan dengan tingkat pertama (a
), berikut ini akan berhasil:df = df.xs('b', axis=1, level=1, drop_level=True)
Pada Pandas 0.24.0 , sekarang kita dapat menggunakan DataFrame.droplevel () :
Ini sangat berguna jika Anda ingin menjaga rantai metode DataFrame Anda bergulir.
sumber
Anda juga bisa mencapainya dengan mengganti nama kolom:
df.columns = ['a', 'b']
Ini melibatkan langkah manual tetapi bisa menjadi pilihan terutama jika Anda akhirnya akan mengubah nama frame data Anda.
sumber
df.columns.get_level_values(1)
.Trik kecil menggunakan
sum
level = 1 (berfungsi saat level = 1 semuanya unik)Solusi yang lebih umum
get_level_values
sumber
Saya telah bergumul dengan masalah ini karena saya tidak tahu mengapa fungsi droplevel () saya tidak berfungsi. Bekerja melalui beberapa dan belajar bahwa 'a' di tabel Anda adalah nama kolom dan 'b', 'c' adalah indeks. Apakah seperti ini akan membantu
sumber