stack dan unstack dengan MultiIndex
Putarkan aras lajur paling dalam menjadi indeks baris dengan stack() dan kembalikan dengan unstack().
stack dan unstack dengan MultiIndex ialah pelajaran Pandas & NumPy Academy percuma di CoddyKit. Ini ialah pelajaran 3 daripada 4. Anda boleh membaca keseluruhan pelajaran di bawah secara percuma — kemudian berlatih secara praktikal dalam pelayar menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Pandas & NumPy Academy, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Pandas & NumPy Academy merangkumi sejumlah 4 pelajaran.
Pengenalan kepada stack dan unstack
stack() dan unstack() ialah alat pembentukan semula Pandas yang memindahkan data antara indeks baris dan indeks lajur. Alat ini amat berguna apabila bekerja dengan DataFrames yang mempunyai MultiIndex pada mana-mana paksi. stack() mengambil aras lajur paling dalam dan memutarkannya menjadi aras baris paling dalam, manakala unstack() melakukan perkara yang sebaliknya.
stack(): Lajur kepada Baris
DataFrame.stack() memutarkan aras paling dalam label lajur menjadi aras paling dalam indeks baris, lalu menghasilkan hasil yang lebih panjang dan lebih sempit. Jika DataFrame asal mempunyai lajur mudah (bukan berbilang aras), hasilnya ialah Series dengan MultiIndex. Jika lajur mempunyai berbilang aras, stack() mengurangkan bilangan aras lajur 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 kepada Lajur
Series.unstack() (atau DataFrame.unstack()) ialah songsangan stack(). Ia mengambil aras paling dalam indeks baris dan memutarkannya menjadi label lajur baharu, lalu menghasilkan hasil yang lebih lebar. Dari segi fungsi, ia serupa dengan pivot() tetapi berfungsi terus pada indeks, bukannya pada nilai lajur.
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 Aras untuk stack
Bagi DataFrames yang mempunyai MultiIndex pada lajur, stack(level) membolehkan anda memilih aras yang hendak diputar. Hantarkan nombor aras (0 untuk aras paling luar, -1 untuk aras paling dalam, iaitu lalai) atau nama aras. Begitu juga, unstack(level) memilih aras indeks baris yang hendak diputar menjadi lajur. Kawalan terperinci ini penting untuk menavigasi struktur data hierarki 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 Aras Baris Tertentu
Apabila DataFrame mempunyai MultiIndex pada baris (situasi yang lazim selepas groupby() pada berbilang lajur), anda boleh menggunakan unstack() pada aras baris tertentu untuk mengembangkannya merentasi lajur. Ini ialah corak yang sangat lazim untuk membina ringkasan bergaya jadual silang tanpa memanggil pivot_table() secara jelas.
# 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 200Mengendalikan Nilai Hilang dalam stack/unstack
Apabila unstack() dipanggil dan tidak setiap gabungan indeks baris wujud bagi setiap aras lajur, Pandas mengisi sel yang hilang dengan NaN. Sebaliknya, stack() secara lalai menggugurkan baris yang keseluruhannya NaN. Anda boleh mengawal perkara ini dengan parameter dropna: hantarkan stack(dropna=False) untuk mengekalkan 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() Kemudian Mengira pada Baris
Satu corak yang berkuasa ialah menggunakan stack() pada DataFrame berformat lebar untuk menukar lajur menjadi baris, menggunakan operasi mengikut baris seperti penapisan atau groupby, kemudian menggunakan unstack() untuk kembali kepada format lebar. Cara ini mengelakkan keperluan menulis gelung lajur demi lajur serta memastikan kod anda tervector dan mudah dibaca. Ia amat berguna untuk menggunakan transformasi yang sama pada setiap lajur secara serentak.
# 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 Membuat Plot
Sama seperti melt(), stack() menukar data kepada format panjang, iaitu format yang dijangkakan oleh Seaborn dan banyak fungsi pembantu Matplotlib. Perbezaan utamanya ialah stack() beroperasi pada indeks lajur dan mengekalkan struktur MultiIndex, manakala melt() menghasilkan DataFrame panjang yang rata. Kedua-duanya menghasilkan aliran kerja pemplotan 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 Semula Indeks
Selepas operasi stack, aras baris paling dalam ialah nama lajur asal. Kadangkala anda mahu aras luar menjadi nama pemboleh ubah dan aras dalam menjadi indeks baris asal. Gunakan swaplevel() pada MultiIndex untuk menukar susunan dua aras, kemudian gunakan sort_index() untuk memulihkan susunan yang kemas.
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 95Bila Hendak Menggunakan stack, melt atau pivot
Pilih stack() apabila bekerja dengan DataFrames lajur MultiIndex dan anda mahu mengurangkan aras lajur sebanyak satu. Pilih melt() apabila anda mempunyai DataFrame rata dan mahu menukar format lebar kepada format panjang dengan kawalan terhadap lajur yang menjadi baris. Pilih pivot()/pivot_table() untuk menukar format panjang kembali kepada format lebar. Ketiga-tiga alat ini merangkumi semua keperluan pembentukan semula format 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 Praktikal: Lembaran Rujukan Pembentukan Semula
Berikut ialah model mental ringkas: stack() — lajur diruntuhkan menjadi baris, lalu DataFrame menjadi lebih sempit dan lebih tinggi. unstack() — baris dikembangkan menjadi lajur, lalu DataFrame menjadi lebih lebar dan lebih pendek. melt() — lajur bernama diruntuhkan menjadi pasangan kunci-nilai (dua lajur baharu). pivot_table() — lajur kunci-nilai dikembangkan menjadi berbilang lajur. Keempat-empatnya boleh diterbalikkan, dan mengetahui arah yang hendak digunakan bergantung pada sama ada analisis sasaran anda 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)Semakan Pantas
Uji pemahaman anda tentang stack dan unstack dengan MultiIndex daripada pelajaran ini.
Imbas Kembali Pelajaran
Dalam pelajaran ini, anda telah mempelajari bahawa stack() memutarkan label lajur menjadi indeks baris untuk menghasilkan hasil yang lebih panjang dan lebih sempit; unstack() melakukan perkara sebaliknya dengan memutarkan aras indeks baris menjadi lajur; kedua-duanya berfungsi dengan struktur MultiIndex daripada operasi groupby; dan swaplevel() membolehkan anda menyusun semula aras indeks. Seterusnya, kita akan meneroka pd.crosstab() untuk menghasilkan jadual kekerapan dengan cepat antara lajur kategori.
Pelajari Python dengan tutor kecerdasan buatan — percuma
Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.
- Kursus
- 30
- Pelajaran
- 120
Soalan Lazim
Adakah pelajaran “stack dan unstack dengan MultiIndex” percuma?
Ya — teks penuh “stack dan unstack dengan MultiIndex” boleh dibaca secara percuma di web ini. Untuk berlatih secara interaktif menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7, serta membuka kunci baki kursus Pandas & NumPy Academy, tingkat taraf kepada CoddyKit PRO. Kursus Pandas & NumPy Academy merangkumi sejumlah 4 pelajaran.
Apakah yang akan saya pelajari dalam “stack dan unstack dengan MultiIndex”?
Putarkan aras lajur paling dalam menjadi indeks baris dengan stack() dan kembalikan dengan unstack(). Anda berlatih Pandas & NumPy Academy menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.
Adakah saya memerlukan pengalaman untuk memulakan Pandas & NumPy Academy?
Tiada pengalaman terdahulu diperlukan. Pembelajaran Pandas & NumPy Academy di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 3 daripada 4.
Berapa lamakah pelajaran “stack dan unstack dengan MultiIndex” diambil?
Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.
Bolehkah saya menulis dan menjalankan kod dalam pelajaran Pandas & NumPy Academy ini?
Ya. Setiap pelajaran Pandas & NumPy Academy menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.
Semua pelajaran dalam kursus ini
- pivot_table: Jadual Silang
- melt: Format Lebar kepada Panjang
- stack dan unstack dengan MultiIndex
- crosstab untuk Jadual Kekerapan