MultiIndex ile stack ve unstack
En içteki sütun düzeyini stack() ile satır indeksine taşıyın ve unstack() ile geri çevirin.
MultiIndex ile stack ve unstack, CoddyKit'te ücretsiz bir Pandas & NumPy Academy dersidir. Bu, 4 dersinin 3. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Pandas & NumPy Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Pandas & NumPy Academy kursu toplamda 4 dersten oluşur.
stack ve unstack'e Giriş
stack() ve unstack(), verileri satır dizini ile sütun dizini arasında taşıyan Pandas yeniden şekillendirme araçlarıdır. Her iki eksende de MultiIndex bulunan DataFrame'lerle çalışırken özellikle kullanışlıdırlar. stack() en içteki sütun düzeyini alıp en içteki satır düzeyine dönüştürür; unstack() ise bunun tersini yapar.
stack(): Sütunları Satırlara Dönüştürme
DataFrame.stack(), sütun etiketlerinin en iç düzeyini satır dizininin en iç düzeyine döndürerek daha uzun ve daha dar bir sonuç üretir. Özgün DataFrame basit (çok düzeyli olmayan) sütunlara sahipse sonuç, MultiIndex içeren bir Series olur. Sütunlar birden fazla düzeye sahipse stack() sütun düzeylerini bir azaltır.
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(): Satırlardan Sütunlara
Series.unstack() (veya DataFrame.unstack()), stack() işleminin tersidir. Satır dizininin en iç düzeyini alır ve yeni sütun etiketlerine dönüştürerek daha geniş bir sonuç üretir. İşlevsel olarak pivot() işlemine benzer; ancak sütun değerleri yerine doğrudan dizin üzerinde çalışır.
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!Hangi Düzeyin stack Edileceğini Seçme
Sütunlarında MultiIndex bulunan DataFrame'lerde stack(level), hangi düzeyin döndürüleceğini seçmenizi sağlar. Bir düzey numarası (en dış düzey için 0, en iç düzey için -1; varsayılan) veya bir düzey adı verin. Benzer şekilde unstack(level), sütunlara döndürülecek satır dizini düzeyini seçer. Bu ayrıntılı denetim, karmaşık hiyerarşik veri yapılarını incelemek için gereklidir.
# 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())Belirli Satır Düzeylerinde unstack()
DataFrame satırlarda bir MultiIndex içerdiğinde (birden fazla sütun üzerinde groupby() sonrasında bu durum yaygındır), belirli bir satır düzeyini unstack() ederek sütunlara yayabilirsiniz. Bu, açıkça pivot_table() çağırmadan çapraz tablo tarzı özetler oluşturmak için çok yaygın bir kalıptır.
# 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 200stack/unstack İşlemlerinde Eksik Değerleri Ele Alma
unstack() çağrıldığında her sütun düzeyi için her satır dizini birleşimi mevcut değilse Pandas, eksik hücreleri NaN ile doldurur. Buna karşılık stack(), varsayılan olarak tamamen NaN olan satırları kaldırır. Bu davranışı dropna parametresiyle denetleyebilirsiniz: NaN satırlarını korumak için stack(dropna=False) aktarın.
# 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Önce stack(), Sonra Satırlar Üzerinde Hesaplama
Güçlü bir kalıp, geniş bir DataFrame'i stack() ile sütunları satırlara dönüştürecek şekilde daraltmak, ardından filtreleme veya groupby gibi satır bazlı bir işlem uygulamak ve son olarak geniş biçime dönmek için unstack() kullanmaktır. Bu yaklaşım, sütun sütun döngüler yazma gereğini ortadan kaldırır ve kodunuzu vektörleştirilmiş ve okunabilir tutar. Özellikle aynı dönüşümü tüm sütunlara eşzamanlı uygulamak için kullanışlıdır.
# 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Çizim İçin stack()
melt() gibi stack() de verileri Seaborn'un ve birçok Matplotlib yardımcısının beklediği uzun biçime dönüştürür. Temel fark, stack() işleminin sütun dizini üzerinde çalışıp MultiIndex yapısını koruması; melt() işleminin ise düz bir uzun DataFrame üretmesidir. Her ikisi de benzer çizim iş akışlarına olanak sağlar.
# 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')Dizinleri Yeniden Sıralamak İçin swaplevel()
Yığınlama sonrasında en içteki satır düzeyi, özgün sütun adıdır. Bazen dış düzeyin değişken adı, iç düzeyin ise özgün satır dizini olmasını istersiniz. İki düzeyin sırasını değiştirmek için MultiIndex üzerinde swaplevel() kullanın, ardından düzenli bir sıralamayı yeniden oluşturmak için sort_index() çağırın.
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 95stack, melt ve pivot Ne Zaman Kullanılır
MultiIndex sütunları içeren DataFrame'lerle çalışırken ve sütun düzeylerini bir azaltmak istediğinizde stack() seçin. Düz bir DataFrame'iniz varsa ve hangi sütunların satır olacağını denetleyerek geniş biçimden uzun biçime geçmek istiyorsanız melt() kullanın. Uzun biçimden yeniden geniş biçime geçmek için pivot()/pivot_table() seçin. Bu üç araç, Pandas'taki tüm geniş/uzun biçim dönüştürme gereksinimlerini karşılar.
# 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)Uygulamalı Özet: Yeniden Şekillendirme Kısa Rehberi
Kısa bir zihinsel model şöyledir: stack() — sütunlar satırlara dönüşür, DataFrame daha dar ve daha uzun olur. unstack() — satırlar sütunlara açılır, DataFrame daha geniş ve daha kısa olur. melt() — adlandırılmış sütunlar bir anahtar-değer çiftine (iki yeni sütuna) dönüşür. pivot_table() — bir anahtar-değer sütunu birden çok sütuna açılır. Dördü de tersine çevrilebilir; hangi yönde ilerleyeceğinizi bilmek, hedef analizinizin geniş mi yoksa uzun mu biçimi tercih ettiğine karar vermenizden ibarettir.
# 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)Hızlı Kontrol
Bu derste öğrendiklerinizle MultiIndex içeren stack ve unstack konusundaki anlayışınızı sınayın.
Ders Özeti
Bu derste şunları öğrendiniz: stack(), daha uzun ve dar bir sonuç üretmek için sütun etiketlerini satır dizinine döndürür; unstack() bunun tersini yaparak bir satır dizini düzeyini sütunlara döndürür; her ikisi de groupby işlemlerinden elde edilen MultiIndex yapılarıyla çalışır; swaplevel() ise dizin düzeylerini yeniden sıralamanızı sağlar. Sırada, kategorik sütunlar arasındaki hızlı sıklık tabloları için pd.crosstab() var.
Sıkça Sorulan Sorular
“MultiIndex ile stack ve unstack” dersi ücretsiz mi?
Evet — “MultiIndex ile stack ve unstack” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Pandas & NumPy Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Pandas & NumPy Academy kursu toplamda 4 dersten oluşur.
“MultiIndex ile stack ve unstack” dersinde ne öğreneceğim?
En içteki sütun düzeyini stack() ile satır indeksine taşıyın ve unstack() ile geri çevirin. Pandas & NumPy Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
Pandas & NumPy Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te Pandas & NumPy Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 3. dersidir.
“MultiIndex ile stack ve unstack” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu Pandas & NumPy Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her Pandas & NumPy Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- pivot_table: Çapraz Tablo
- melt: Geniş Biçimden Uzun Biçime
- MultiIndex ile stack ve unstack
- Frekans Tabloları için crosstab