stack dan unstack dengan MultiIndex
Putar tingkat kolom terdalam menjadi indeks baris dengan stack() dan kembalikan dengan unstack().
stack dan unstack dengan MultiIndex adalah pelajaran Pandas & NumPy Academy gratis di CoddyKit. Ini adalah pelajaran 3 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Pandas & NumPy Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Pandas & NumPy Academy mencakup 4 pelajaran total.
Pengantar stack dan unstack
stack() dan unstack() adalah alat Pandas untuk mengubah bentuk data, dengan memindahkan data antara indeks baris dan indeks kolom. Keduanya sangat berguna ketika bekerja dengan DataFrames yang memiliki MultiIndex pada salah satu sumbu. stack() mengambil tingkat kolom terdalam dan memutarnya menjadi tingkat baris terdalam, sedangkan unstack() melakukan kebalikannya.
stack(): Kolom Menjadi Baris
DataFrame.stack() memutar tingkat terdalam label kolom menjadi tingkat terdalam indeks baris, sehingga menghasilkan keluaran yang lebih panjang dan lebih sempit. Jika DataFrame asli memiliki kolom sederhana (bukan multi-tingkat), hasilnya adalah Series dengan MultiIndex. Jika kolom memiliki beberapa tingkat, stack() mengurangi jumlah tingkat kolom sebanyak satu.
import pandas as pd
df = pd.DataFrame({
'Math': [85, 90, 78],
'Science': [92, 88, 95]
}, index=['Alice', 'Bob', 'Carol'])
print(df)
# Math Science
# Alice 85 92
# Bob 90 88
# Carol 78 95
stacked = df.stack()
print(stacked)
# Alice Math 85
# Science 92
# Bob Math 90
# Science 88
# Carol Math 78
# Science 95
# dtype: int64unstack(): Baris Menjadi Kolom
Series.unstack() (atau DataFrame.unstack()) merupakan kebalikan dari stack(). Fungsi ini mengambil tingkat terdalam indeks baris dan memutarnya menjadi label kolom baru, sehingga menghasilkan keluaran yang lebih lebar. Secara fungsi, ini mirip dengan pivot(), tetapi bekerja langsung pada indeks, bukan pada nilai kolom.
stacked = df.stack()
print(type(stacked)) # Series with MultiIndex
# Restore the original wide format
df_restored = stacked.unstack()
print(df_restored)
# Math Science
# Alice 85 92
# Bob 90 88
# Carol 78 95
# Identical to the original df!Memilih Tingkat yang Akan Di-stack
Untuk DataFrames dengan MultiIndex pada kolom, stack(level) memungkinkan Anda memilih tingkat yang akan diputar. Berikan nomor tingkat (0 untuk tingkat terluar, -1 untuk tingkat terdalam, yang merupakan nilai default) atau nama tingkat. Demikian pula, unstack(level) memilih tingkat indeks baris yang akan diputar menjadi kolom. Kendali terperinci ini penting untuk menavigasi struktur data hierarkis yang kompleks.
# MultiIndex columns
arrays = [['Math', 'Math', 'Science', 'Science'],
['Q1', 'Q2', 'Q1', 'Q2']]
multi_cols = pd.MultiIndex.from_arrays(arrays, names=['subject', 'quarter'])
df_multi = pd.DataFrame([[85, 90, 92, 88], [78, 80, 95, 91]],
index=['Alice', 'Bob'], columns=multi_cols)
# Stack the 'quarter' level (innermost, level=-1)
print(df_multi.stack(level='quarter').head())unstack() pada Tingkat Baris Tertentu
Ketika DataFrame memiliki MultiIndex pada baris (hal yang umum setelah groupby() pada beberapa kolom), Anda dapat menggunakan unstack() pada tingkat baris tertentu untuk menyebarkannya ke seluruh kolom. Ini adalah pola yang sangat umum untuk membuat ringkasan bergaya tabulasi silang tanpa secara eksplisit memanggil pivot_table().
# GroupBy produces MultiIndex rows
df2 = pd.DataFrame({
'region': ['East', 'East', 'West', 'West'],
'product': ['A', 'B', 'A', 'B'],
'sales': [100, 150, 120, 200]
})
# MultiIndex result from groupby
multi = df2.groupby(['region', 'product'])['sales'].sum()
print(multi)
# Unstack the product level into columns
wide = multi.unstack('product')
print(wide)
# product A B
# region
# East 100 150
# West 120 200Menangani Nilai yang Hilang dalam stack/unstack
Ketika unstack() dipanggil dan tidak setiap kombinasi indeks baris tersedia untuk setiap tingkat kolom, Pandas mengisi sel yang hilang dengan NaN. Sebaliknya, secara default stack() menghapus baris yang seluruh nilainya merupakan NaN. Anda dapat mengendalikannya dengan parameter dropna: berikan stack(dropna=False) untuk mempertahankan baris NaN.
# Incomplete data: West has no product B
df3 = df2[df2['product'] != 'B'].copy()
multi3 = df3.groupby(['region', 'product'])['sales'].sum()
wide3 = multi3.unstack('product', fill_value=0)
print(wide3)
# product A B
# region
# East 100 0 <- B filled with 0 instead of NaN
# West 120 0stack(), Lalu Menghitung pada Baris
Pola yang ampuh adalah menggunakan stack() pada DataFrame berformat lebar untuk mengubah kolom menjadi baris, menerapkan operasi pada baris seperti penyaringan atau groupby, lalu menggunakan unstack() untuk kembali ke format lebar. Cara ini menghindari kebutuhan menulis pengulangan kolom demi kolom serta menjaga kode tetap tervectorisasi dan mudah dibaca. Pola ini sangat berguna untuk menerapkan transformasi yang sama pada semua kolom secara bersamaan.
# Normalise each column by its column mean using stack/compute/unstack
normalised = (
df.stack()
.groupby(level=1)
.transform(lambda s: (s - s.mean()) / s.std())
.unstack()
)
print(normalised.round(2))
# Math Science
# Alice 0.0 0.39
# Bob 1.13 -1.09
# Carol -1.13 0.71stack() untuk Pembuatan Plot
Sama seperti melt(), stack() mengubah data ke format panjang, yaitu format yang diharapkan Seaborn dan banyak fungsi pembantu Matplotlib. Perbedaan utamanya adalah stack() bekerja pada indeks kolom dan mempertahankan struktur MultiIndex, sedangkan melt() menghasilkan DataFrame panjang yang datar. Keduanya menghasilkan alur kerja pembuatan plot yang serupa.
# Prepare data for line plot using stack
long = df.stack().reset_index()
long.columns = ['student', 'subject', 'score']
print(long)
# student subject score
# 0 Alice Math 85
# 1 Alice Science 92
# ...
# Ready for: sns.barplot(data=long, x='student', y='score', hue='subject')swaplevel() untuk Menyusun Ulang Indeks
Setelah stacking, tingkat baris terdalam merupakan nama kolom asli. Terkadang Anda ingin tingkat terluar menjadi nama variabel dan tingkat terdalam menjadi indeks baris asli. Gunakan swaplevel() pada MultiIndex untuk menukar urutan dua tingkat, lalu gunakan sort_index() untuk mengembalikan urutan yang rapi.
stacked = df.stack() # MultiIndex: (student, subject)
swapped = stacked.swaplevel() # MultiIndex: (subject, student)
swapped = swapped.sort_index()
print(swapped)
# subject student
# Math Alice 85
# Bob 90
# Carol 78
# Science Alice 92
# Bob 88
# Carol 95Kapan Menggunakan stack, melt, atau pivot
Pilih stack() ketika bekerja dengan DataFrames kolom MultiIndex dan ingin mengurangi tingkat kolom sebanyak satu. Pilih melt() ketika memiliki DataFrame datar dan ingin mengubah format lebar menjadi panjang dengan kendali atas kolom mana yang menjadi baris. Pilih pivot()/pivot_table() untuk mengubah format panjang kembali menjadi lebar. Ketiga alat ini mencakup semua kebutuhan perubahan bentuk data lebar/panjang dalam Pandas.
# Decision guide (comment, not executable standalone):
# MultiIndex columns -> want fewer levels: use stack()
# Flat wide -> need long format for plotting/ML: use melt()
# Long -> need wide summary table: use pivot_table()
# Wide -> back to long: use melt() or stack()
# Example: stack when you have pivot_table output (MultiIndex cols)
tbl = df2.groupby(['region', 'product'])['sales'].sum().unstack()
long_again = tbl.stack().rename('sales').reset_index()
print(long_again)Ringkasan Praktis: Lembar Referensi Perubahan Bentuk
Berikut gambaran singkatnya: stack() — kolom dipadatkan menjadi baris, sehingga DataFrame menjadi lebih sempit dan lebih tinggi. unstack() — baris diperluas menjadi kolom, sehingga DataFrame menjadi lebih lebar dan lebih pendek. melt() — kolom bernama dipadatkan menjadi pasangan kunci-nilai (dua kolom baru). pivot_table() — kolom kunci-nilai diperluas menjadi beberapa kolom. Keempatnya dapat dibalik, dan mengetahui arah yang harus dipilih cukup dengan menentukan apakah analisis yang dituju lebih sesuai dengan format lebar atau panjang.
# stack/unstack cycle
df_wide = df.copy() # wide format
df_long = df_wide.stack() # long via stack
df_wide2 = df_long.unstack() # back to wide
# melt/pivot cycle
df_melted = df_wide.melt(id_vars=[]) # wide -> long
# df_pivoted = df_melted.pivot(...) # long -> wide
print('Original shape: ', df_wide.shape)
print('After stack: ', df_long.shape)
print('After unstack: ', df_wide2.shape)Pemeriksaan Cepat
Uji pemahaman Anda tentang stack dan unstack dengan MultiIndex dari pelajaran ini.
Rangkuman Pelajaran
Dalam pelajaran ini Anda mempelajari bahwa stack() memutar label kolom menjadi indeks baris untuk menghasilkan keluaran yang lebih panjang dan lebih sempit; unstack() melakukan kebalikannya dengan memutar tingkat indeks baris menjadi kolom; keduanya bekerja dengan struktur MultiIndex dari operasi groupby; dan swaplevel() memungkinkan Anda menyusun ulang tingkat indeks. Selanjutnya, kita akan mempelajari pd.crosstab() untuk membuat tabel frekuensi dengan cepat di antara kolom kategorikal.
Belajar Python dengan tutor AI — gratis
Tulis dan jalankan kode asli di browser kamu, dapatkan bantuan instan dari tutor AI 24/7, dan lanjutkan di mana kamu tinggalkan di web atau aplikasi.
- Kursus
- 30
- Pelajaran
- 120
Pertanyaan yang Sering Diajukan
Apakah pelajaran “stack dan unstack dengan MultiIndex” gratis?
Ya — teks lengkap “stack dan unstack dengan MultiIndex” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Pandas & NumPy Academy, upgrade ke CoddyKit PRO. Kursus Pandas & NumPy Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “stack dan unstack dengan MultiIndex”?
Putar tingkat kolom terdalam menjadi indeks baris dengan stack() dan kembalikan dengan unstack(). Kamu berlatih Pandas & NumPy Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai Pandas & NumPy Academy?
Tidak diperlukan pengalaman sebelumnya. Pandas & NumPy Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 3 dari 4.
Berapa lama pelajaran “stack dan unstack dengan MultiIndex” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran Pandas & NumPy Academy ini?
Ya. Setiap pelajaran Pandas & NumPy Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- pivot_table: Tabulasi Silang
- melt: Format Lebar ke Panjang
- stack dan unstack dengan MultiIndex
- crosstab untuk Tabel Frekuensi