Pandas'ta Sütunları Satıra Çevirmek: melt ile Uzun Format
Her ay için ayrı sütunu olan bir tablo okuması kolaydır ama gruplamak ve çizmek zordur. melt bu sütunları iki sütuna (hangi ay, kaç satış) indirir; burada nasıl yapıldığını, sonucu nasıl kullanacağınızı ve pivot ile nasıl geri döneceğinizi görürsünüz.
Bir bakışta
- melt sütunları satırlara dönüştürür. Kimlik sütunları yerinde kalır; diğer sütunların adları bir sütunda, değerleri başka bir sütunda toplanır.
- Uzun biçim analiz araçlarının beklediği biçimdir. Gruplama, filtreleme ve çoğu çizim kütüphanesi her gözlemin tek satır olduğu veriyle çalışır.
- id_vars korunacakları, value_vars eritilecekleri seçer. value_vars verilmezse kimlik dışındaki tüm sütunlar eritilir.
- var_name ve value_name sonucu okunur kılar. Varsayılan variable ve value adlarını anlamlı adlarla değiştirmek sonraki kodu sadeleştirir.
- pivot ters yönde çalışır. Uzun tabloyu yeniden geniş tabloya çevirir; kopya satır varsa pivot_table ile toplama gerekir.
Geniş ve uzun format: fark nedir, neden çevrilir?
Bir mağazanın aylık satışlarını düşünün. Geniş formatta her mağaza tek satırdır ve her ay ayrı bir sütundur: magaza, ocak, şubat, mart. İnsan gözü için bu düzen okunaklıdır ve çoğu zaman Excel'den böyle gelir. Uzun formatta ise her mağaza ve ay çifti kendi satırındadır ve tabloda magaza, ay, satis sütunları bulunur.
Uzun biçimin üstünlüğü, ay bilgisinin artık bir sütun değeri olmasıdır. Bu sayede aya göre gruplamak, aya göre filtrelemek, ayı grafiğin eksenine ya da renge bağlamak tek satırlık işlemlerdir. Geniş formatta aynı işler her ay için ayrı kod gerektirir.
Amaç duruma göre değişir: raporun okuruna geniş tablo göstermek, analiz sırasında uzun tablo kullanmak yaygın bir ikilidir. Bu yüzden iki yönde de dönüştürmeyi bilmek gerekir: melt geniş tabloyu uzuna, pivot uzun tabloyu genişe çevirir.
Analiz için uzuna, rapor için yeniden genişe
İki biçim arasında gidip gelen çalışma akışı
- Geniş tabloDosyadan gelen, ay başına bir sütunu olan hâl.
- meltSütunlar satırlara indirilir.
- Uzun tabloGruplama, filtre ve grafik burada yapılır.
- pivotSonuç rapor için yeniden sütunlara açılır.
melt ile temel dönüşüm
melt dört parametreyle çalışır: id_vars, value_vars, var_name ve value_name. id_vars yerinde kalacak kimlik sütunlarını, value_vars satıra çevrilecek sütunları belirtir. var_name eski sütun adlarının toplanacağı yeni sütunun, value_name da değerlerin toplanacağı yeni sütunun adıdır. Kurgusal bir aylık satış dosyasıyla:
import pandas as pd
genis = pd.read_csv('aylik_satis.csv')
uzun = pd.melt( genis, id_vars=['magaza'], value_vars=['ocak', 'şubat', 'mart'], var_name='ay', value_name='satis', )
print(uzun.head())
Sonuçta magaza sütunu her ay için tekrar eder; ay sütunu sütun adlarını, satis sütunu hücre değerlerini taşır. Satır sayısı, mağaza sayısı ile erittiğiniz sütun sayısının çarpımı kadardır. value_vars vermezseniz kimlik dışındaki tüm sütunlar eritilir; dosyada başka bir açıklama sütunu varsa o da satıra dönüşür, bu yüzden listeyi açıkça yazmak güvenlidir. Aynı işlem DataFrame üzerinden genis.melt(...) olarak da çağrılabilir.
Uzun tabloyu kullanmak: gruplama, filtre, grafik
Dönüşümün karşılığını ilk sorguda görürsünüz. Ay bazlı toplam satış tek satırdır:
uzun.groupby('ay')['satis'].sum()
Belirli mağazanın satışı ise bir filtredir: uzun[uzun['magaza'] == 'A']. Çizim kütüphanelerinde ay sütununu eksene, mağazayı renge bağlamak da uzun tabloyla doğrudan yapılır; geniş tabloda her mağaza için ayrı seri tanımlamanız gerekirdi.
Bir tuzak sıralamadır: ay adları metin olduğundan groupby sonucu alfabetik sıralanır ve ocak, şubat, mart sırası bozulur. Çözüm, ay sütununu sıralı kategorik tipe çevirmek ya da sonucu istenen sırada reindex etmektir. Ay adı yerine tarih tipi kullanıyorsanız (aylık veriler için ay başı tarihi) sıralama zaten doğru gelir.
Erittiğiniz sütunların hepsi sayısal değilse value sütunu karışık tipe düşer. Para ya da miktar sütunlarını eritmeden önce sayısal olduklarını kontrol edin.
Birden çok kimlik sütunu ve eksik değerler
Gerçek tablolarda kimlik tek sütun olmaz: magaza, bolge ve kanal birlikte kimliği oluşturabilir. id_vars listesine hepsini yazarsınız; melt hepsini her satırda yinelenen sütunlar olarak korur. Kimliğin bir parçasını unutursanız o sütun value_vars boşsa erir ve veri bozulur.
Eksik değerler eritme sırasında silinmez: boş bir hücre, değeri boş bir satıra dönüşür. Bu çoğu zaman istenmeyen bir durumdur; dönüşümden sonra dropna ile satırları temizlemek ya da boşluğun anlamını (satış yok mu, veri yok mu) önce netleştirmek gerekir. Sıfır ile boşu karıştırmak raporu yanıltır.
Sütun adı hem ölçümü hem de başka bir bilgiyi taşıyorsa (satis_ocak, iade_ocak gibi) tek bir melt yetmez; önce eritir, sonra ad üzerinden str ile böler ve iki sütuna ayırırsınız. Bu tür işleri adım adım ve her adımda ara sonuca bakarak yapın.
pivot ile geri dönmek
Uzun tablodan geniş tabloya dönmek için DataFrame.pivot kullanılır. Hangi sütunun satır kimliği, hangisinin sütun başlığı, hangisinin hücre değeri olacağını söylersiniz:
geri = uzun.pivot(index='magaza', columns='ay', values='satis') geri = geri.reset_index()
İki noktaya dikkat edin. Birincisi, pivot sütunları sıralı gelen etiketlere göre dizer; ocak, şubat, mart sırasını yeniden kurmak için sonucu istediğiniz sırada seçersiniz. İkincisi, aynı mağaza ve ay çifti birden çok satırda varsa pivot hangi değeri alacağını bilemez ve hata verir. Kopya olan veride pivot_table ile toplama işlevi (toplam, ortalama) vermek gerekir.
Sıklıkla melt ve pivot'u arka arkaya kullanmak yerine, tabloyu yalnızca bir kez uzuna çevirip tüm analizi orada yapmak, raporlama biçimine ise en sonda dönmek daha temiz bir iş akışıdır.
Sık yapılan hatalar
Dönüşüm kısa kod olsa da hatalar sonucu sessizce bozar:
- value_vars vermeyip istemediğiniz sütunları eritmek.
- Kimlik sütununu id_vars'a eklemeyi unutmak; kimlik de eriyip satırlar anlamsızlaşır.
- Var ve value adlarını varsayılan bırakmak; sonraki kodda "variable" ve "value" okunması zorlaşır.
- Eritilen sütunlar farklı tipteyse sonucu sayısal sanmak.
- Ay gibi sıralı etiketleri metin bırakıp sıralamayı bozmak.
- Kopya satırlı veride pivot kullanıp hata almak.
Her dönüşümden sonra satır sayısını kontrol edin: beklenen sayı, kimlik sayısı ile erittiğiniz sütun sayısının çarpımıdır. Fark çıkıyorsa kimlik ya da value_vars listesinde sorun vardır.
Veri dönüştürme becerisi Mindset programlarında nerede çalışılır?
Data Science Bootcamp'in dosyalarla çalışma ve veri edinimi başlıkları, farklı kaynaklardan gelen tabloları okuyup düzenlemenin temelini verir. Data Science Uzmanlığı Sertifika Programı veri işleme modülünde pandas ve ötesini, Veri Bilimi Sertifika Programı ise NumPy, pandas ve görselleştirmeyi birlikte işler. Excel'den gelen geniş raporları analize hazırlayan analistlerin düzenli ihtiyacıdır.
İlgili Mindset programı
Data Science Bootcamp
Sık sorulan sorular
melt ile stack arasında ne fark var?
İkisi de sütunları satırlara çevirir, ama melt kimlik sütunlarını açıkça belirtmenize ve çıktı sütunlarını adlandırmanıza izin verir. stack ise sütun düzeyini indekse taşır ve daha çok çok düzeyli indekslerle çalışırken kullanılır. Düz tablolarda melt daha okunaklı ve anlaşılırdır.
Sütun adlarını nasıl daha anlamlı hâle getiririm?
var_name eski sütun adlarının toplanacağı yeni sütunun adını, value_name ise değerlerin toplanacağı sütunun adını belirler. İkisini de ne anlama geldiğini yansıtacak şekilde yazın; böylece sonraki gruplama ve çizim kodu açık okunur ve varsayılan adlarla ortaya çıkan karışıklık olmaz.
melt sonucunda aynı satır neden tekrar ediyor?
Kimlik sütunları her eritilen sütun için bir kez tekrar eder; bu beklenen davranıştır. Mağaza her ay için ayrı satırdadır. Gerçek bir kopya şüphesi varsa kimlik sütunlarıyla birlikte ay sütununa göre duplicated ile kontrol edin; aynı çift iki kez geçiyorsa kaynak veride kopya vardır.
Excel'deki unpivot ile aynı mı?
Mantık aynıdır: seçilen sütunlar iki sütuna, ad ve değer sütunlarına dönüşür. Excel'de bu işlem Power Query'deki sütunları satıra çevirme komutuyla yapılır. pandas'ta ise kod olarak yazıldığı için tekrarlanabilir ve başka veriye aynen uygulanabilir.
Çok sayıda sütunu tek tek yazmadan nasıl eritirim?
value_vars listesini kodla üretin; örneğin sütun adlarını bir kalıba göre süzün ya da kimlik sütunlarını çıkarıp kalanı alın. id_vars verip value_vars vermezseniz kalan her şey zaten erir. Ama kontrol edilmemiş bir listeyle çalışmak risklidir, sonucu satır sayısıyla doğrulayın.