Pandas & NumPy Academy · Pelajaran

stack dan unstack dengan MultiIndex

Putarkan aras lajur paling dalam menjadi indeks baris dengan stack() dan kembalikan dengan unstack().

Pelajaran 3 daripada 413 langkah

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

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

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

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

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

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

Percuma untuk bermula

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

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