Pandas & NumPy Academy · Pelajaran

stack dan unstack dengan MultiIndex

Putar tingkat kolom terdalam menjadi indeks baris dengan stack() dan kembalikan dengan unstack().

Pelajaran 3 dari 413 langkah

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: int64

unstack(): 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  200

Menangani 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    0

stack(), 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.71

stack() 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      95

Kapan 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.

Gratis untuk memulai

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

  1. pivot_table: Tabulasi Silang
  2. melt: Format Lebar ke Panjang
  3. stack dan unstack dengan MultiIndex
  4. crosstab untuk Tabel Frekuensi
← Kembali ke Pandas & NumPy Academy