- groupby ne yapar? Bölme, uygulama, birleştirme
- İlk gruplama: tek anahtar, tek özet
- agg ile birden fazla özeti tek seferde almak
- transform: grup özetini satırlara geri taşımak
- filter ve head: gruplara göre satır seçmek
- Zaman bazlı gruplama ve sık kullanılan ayarlar
- Sık yapılan hatalar
- Mindset programlarında bu beceri nerede çalışılır?
- Sık sorulan sorular
Pandas groupby: gruplayarak özetleme adım adım
Pandas groupby ile veriyi gruplama, agg ile özetleme, transform ve filter kullanımı; as_index, dropna gibi ayarlar ve sık hatalar örneklerle.
groupby ne yapar? Bölme, uygulama, birleştirme
groupby, bir tablonun satırlarını bir ya da birden fazla sütunun değerine göre gruplara ayırır, her gruba bir işlem uygular ve sonuçları tek tabloda birleştirir. Pandas belgeleri bu mantığı split-apply-combine olarak anlatır. Excel'deki pivot tablonun ya da SQL'deki GROUP BY ifadesinin karşılığıdır; farkı, işlemi kodla tekrarlanabilir hâle getirmesidir.
Uygulama adımı türlere ayrılır: toplulaştırma (her grubu tek değere indirger, örneğin toplam ya da ortalama), dönüştürme (her satıra grup bilgisini geri taşır) ve filtreleme (belirli gruplardaki satırları tutar ya da atar). Hangi türe ihtiyacınız olduğunu anlamak, doğru yöntemi seçmenin yarısıdır.
Örnek tabloyu şöyle düşünelim: satis adlı DataFrame'de bolge, product, tarih ve tutar sütunları var.
İlk gruplama: tek anahtar, tek özet
En basit kullanım, bir sütuna göre gruplayıp bir sütunu özetlemektir:
import pandas as pd
satis.groupby("bolge")["tutar"].sum()
Bu ifade her bölge için tutar toplamını verir ve sonuç bölge adlarının indeks olduğu bir Series'tir. Ortalama için mean, ortanca için median, kayıt sayısı için size, benzersiz değer sayısı için nunique kullanılır. Bir grup için kaç satır olduğunu görmek, özetlerden önce yapılacak en yararlı sağlamadır.
Birden fazla anahtar vermek için liste kullanın:
satis.groupby(["bolge", "product"])["tutar"].mean()
Sonuç, bölge ve ürün düzeylerinden oluşan çok düzeyli bir indekse sahip olur. Bu çok düzeyli yapıyı sütunlara çevirmek için reset_index çağırın. Gruplama anahtarları, sütun adı olabildiği gibi indeks düzeyi, fonksiyon ya da dizi de olabilir; pandas gruplamayı ancak bir işlem uygulandığında çalıştırır.
agg ile birden fazla özeti tek seferde almak
Gerçek raporlarda bir sütunun yalnızca toplamı değil, aynı anda toplamı, ortalaması ve sayısı istenir. agg bunu tek çağrıda yapar. Pandas belgelerinin tavsiye ettiği biçim adlandırılmış toplulaştırmadır; çıktı sütunlarına doğrudan ad verirsiniz:
ozet = satis.groupby("bolge").agg( toplam_tutar=("tutar", "sum"), ortalama_tutar=("tutar", "mean"), islem_sayisi=("tutar", "size"), )
Anahtar sözcük adı çıktı sütununun adı, değer ise (sütun, işlev) çiftidir. Farklı sütunlara farklı işlevler uygulamak için bu biçimi kullanmak, sözlük ya da liste biçimine göre sonucu daha okunaklı kılar. Kendi yazdığınız bir lambda işlevi de verebilirsiniz, ancak yerleşik işlevler (sum, mean, max gibi) lambda'dan belirgin biçimde hızlıdır; mümkünse yerleşik olanı seçin.
Gruplama anahtarlarını sonuçta normal sütun olarak görmek istiyorsanız groupby çağrısında as_index=False verin ya da sonuna reset_index ekleyin. Raporu başka bir araca aktaracaksanız bu düzenleme çoğu zaman gerekir.
transform: grup özetini satırlara geri taşımak
Bazen sonucu gruplar için tek satır değil, orijinal tablonun her satırı için istersiniz. Örneğin her satırın, kendi bölgesinin toplamındaki payını bulmak istiyorsunuz. transform, grup sonucunu orijinal indekse yayarak aynı uzunlukta bir Series döndürür:
satis["bolge_toplami"] = satis.groupby("bolge")["tutar"].transform("sum") satis["pay"] = satis["tutar"] / satis["bolge_toplami"]
Böylece ayrı tabloları birleştirmeye gerek kalmaz. Aynı yöntem grup içi standartlaştırma, grup ortalamasıyla eksik değer doldurma ya da grup içi sıralama gibi işlerde de çalışır. cumsum, shift, rank ve pct_change gibi işlevler de gruplar içinde uygulanarak satır sayısını korur: örneğin her müşteri için siparişleri tarihe göre sıralayıp kümülatif harcamayı bulabilirsiniz.
Karıştırılan nokta şudur: agg satır sayısını gruplara indirger, transform satır sayısını korur. Sonucu orijinal tabloya yeni bir sütun olarak eklemeniz gerekiyorsa transform, ayrı bir özet tablo istiyorsanız agg kullanın.
filter ve head: gruplara göre satır seçmek
filter, bir koşulu sağlayan grupların tüm satırlarını tutar. Koşul, grubu temsil eden bir tablo alıp doğru ya da yanlış döndürmelidir:
satis.groupby("product").filter(lambda g: g["tutar"].sum() > threshold)
Bu ifade toplam tutarı threshold değişkenindeki değerin altında kalan ürünleri eler. Eşiği kod içine gömmek yerine bir değişkende tutmak ileride değiştirmeyi kolaylaştırır.
Her gruptan belirli satırları almak için head, tail ve nth hazırdır: satis.groupby("bolge").head() her bölgenin ilk kayıtlarını getirir. En yüksek tutarlı siparişleri bulmak için önce sort_values ile sıralayıp ardından groupby ve head kullanılır. İş yaşamındaki tipik kullanım: her müşterinin son siparişini ya da her bölgenin en çok satan ürününü çıkarmak.
Zaman bazlı gruplama ve sık kullanılan ayarlar
Tarih sütunu varsa aylık ya da haftalık özet için pd.Grouper kullanılır:
satis.groupby(pd.Grouper(key="tarih", freq="MS"))["tutar"].sum()
Burada tarih sütununun datetime türünde olması gerekir; metin olarak okunmuşsa önce pd.to_datetime ile çevirin. Aylık başlangıç frekansı için MS kısaltması kullanılır; diğer frekansları pandas belgesinden kontrol edin.
Davranışı etkileyen birkaç ayar bilinmelidir: • dropna: Varsayılan olarak grup anahtarı eksik olan satırlar sonuca girmez. dropna=False verirseniz eksik anahtarlar kendi grubunu oluşturur. • sort: Grup anahtarları varsayılan olarak sıralanır; sort=False verirseniz ilk görünüş sırası korunur ve bazen daha hızlı çalışır. • observed: Anahtar kategorik türdeyse gözlenmeyen kategorilerin de sonuçta görünüp görünmeyeceğini belirler. Varsayılan sürümler arasında değişebildiği için açıkça yazın. • as_index: Anahtarların indeks mi sütun mu olacağını belirler.
Sık yapılan hatalar
- Eksik anahtarı fark etmemek: dropna varsayılanı nedeniyle anahtarı boş satırlar sessizce kaybolur. Önce isna ile anahtarı kontrol edin.
- agg ve transform'u karıştırmak: Beklenmeyen satır sayısı bu karışıklıktan gelir.
- Lambda'yı gereksiz kullanmak: Yerleşik işlev varken lambda yavaşlatır.
- Tarihi metin bırakmak: Zaman bazlı gruplama çalışmaz veya hata verir.
- Çok düzeyli indeksle şaşırmak: Sonucu düz tabloya çevirmek için reset_index kullanın.
- Ortalamaların ortalamasını almak: Gruplar farklı büyüklüktedir; genel ortalamayı grup ortalamalarından değil, ham satırlardan hesaplayın.
- Kategorik anahtarda gözlenmemiş kategorileri ihmal etmek: observed ayarı sonuçtaki satır sayısını değiştirir.
- Sonucu doğrulamamak: Birkaç grubu elle filtreleyip toplamı karşılaştırmak, hatayı ilk anda yakalar.
Mindset programlarında bu beceri nerede çalışılır?
Gruplama ve özetleme, veri analizinin merkezindeki işlemlerdendir; satış, İK, operasyon gibi her alanda grup bazlı rapor üretmek için kullanılır. Mindset'in Python ile Veri Analizi (Pandas) eğitimi Gruplama, Toplulaştırma ve Pivot Analizi modülüyle bu konuyu doğrudan işler; Filtreleme, Seçme ve Koşullu Sorgulama ile Vaka Çalışmaları ve İş Analitiğinde Pandas modülleri ise gruplamayı gerçek iş sorularına bağlar.
Eğitim, Excel'de pivot tabloyla çalışan ve tekrarlanabilir, otomatik rapora geçmek isteyen analistler, iş analistleri ve raporlama ekipleri için uygundur. Kurumsal ekipler aylık raporlarını kodla yeniden üretilebilir hâle getirmek için bu temeli kullanabilir.
İlgili Mindset programı
Python ile Veri Analizi (Pandas)
Sık sorulan sorular
groupby ile pivot_table arasındaki fark nedir?
İkisi de gruplama yapar. groupby daha esnektir: agg, transform ve filter gibi çeşitli işlemleri destekler. pivot_table ise sonucu satır ve sütunlara yayılmış, Excel'deki pivot tabloya benzeyen bir çapraz tablo olarak verir. Çapraz tablo görünümü gerekmiyorsa groupby daha doğrudan seçimdir.
Gruplama sonucunu DataFrame'e nasıl çeviririm?
Sonuç bir Series ise reset_index çağırarak anahtarları sütuna döndürüp düz DataFrame elde edersiniz. agg ile adlandırılmış toplulaştırma kullandıysanız sonuç zaten DataFrame'dir; anahtarlar indekste kalır, as_index=False ya da reset_index ile sütuna alınır.
Birden fazla sütunu aynı anda nasıl gruplarım?
Anahtarları bir liste olarak verin: groupby(["bolge", "product"]). Sonuç çok düzeyli bir indeks taşır. Düz tablo için reset_index kullanın. Sıralama, anahtarların listedeki sırasına göre yapılır; bu nedenle liste sırası, sonucun okunuşunu etkiler.
groupby çok yavaşsa ne yapmalıyım?
Lambda yerine yerleşik işlev (sum, mean gibi) kullanın, gereksiz sütunları gruplamadan önce seçin ve gerekiyorsa sort=False verin. Anahtar sütun metin yerine kategorik türe çevrildiğinde de bellek ve hız kazanımı olur. Çok büyük veride Pandas'ın sınırlarını da hesaba katın.
Gruptaki en yüksek değere sahip satırı nasıl bulurum?
Tabloyu ilgili sütuna göre sıralayın, ardından groupby ile her gruptan ilk satırı alın: sort_values ve groupby(...).head. Ayrıca idxmax ile en yüksek değerin indeksini bulup loc ile satırı çekebilirsiniz. Eşit değerlerde hangisinin döneceğine dikkat edin.
İlgili rehberler
Kategori: Veri Analitiği ve İş Zekası