Gruplama için temel yöntem: groupby ve agg
pandas içinde gruplara göre hesaplama yapmak için önce groupby() ile hangi sütuna göre gruplanacağını belirtin, ardından sum(), mean(), count() veya agg() gibi bir toplulaştırma yöntemi uygulayın. Böylece her grup için ayrı toplam, ortalama, adet veya birden fazla hesaplama elde edebilirsiniz. Aşağıdaki örnekte satışları departmana göre gruplayıp toplam ciroyu, ortalama birim fiyatını ve işlem sayısını çıkaracağız.Ön koşul olarak
pandas kurulu olmalı ve veriniz bir DataFrame içinde bulunmalıdır. Örnek veri varsayımsaldır:
Python:
import pandas as pd
veri = pd.DataFrame({
"departman": ["Teknoloji", "Teknoloji", "Ofis", "Ofis", "Teknoloji"],
"urun": ["Klavye", "Fare", "Defter", "Kalem", "Monitör"],
"adet": [3, 5, 10, 20, 2],
"birim_fiyat": [800, 400, 75, 25, 6000]
})
veri["ciro"] = veri["adet"] * veri["birim_fiyat"]
sonuc = (
veri.groupby("departman", as_index=False)
.agg(
toplam_ciro=("ciro", "sum"),
ortalama_birim_fiyat=("birim_fiyat", "mean"),
islem_sayisi=("urun", "count")
)
)
print(sonuc)
Bu hesaplamada
groupby("departman") aynı departmandaki satırları bir araya getirir. agg() içindeki her ifade, çıktıdaki sütun adını, kaynak sütunu ve uygulanacak hesaplamayı belirtir. Sonuç yaklaşık olarak şöyledir:
Kod:
departman toplam_ciro ortalama_birim_fiyat islem_sayisi
0 Ofis 1250 50.0 2
1 Teknoloji 16400 2400.0 3
Buradaki toplam_ciro, o departmandaki tüm satırların cirosunun toplamıdır. islem_sayisi ürün adlarının sayısını gösterir; eksik değerleri saymak istiyorsanız
count() yerine sütunun niteliğine göre size kullanmanız gerekebilir.Tek veya birden fazla hesaplama uygulama
Tek bir hesaplama yapacaksanız daha kısa yöntemler kullanılabilir:
Python:
departman_toplamlari = veri.groupby("departman")["ciro"].sum()
ortalama_fiyatlar = veri.groupby("departman")["birim_fiyat"].mean()
satir_sayilari = veri.groupby("departman").size()
Bu kullanımda sonuçların grup adı çoğunlukla dizin olarak gelir. Grup adını normal sütun olarak almak isterseniz
.reset_index() ekleyebilir veya baştan as_index=False kullanabilirsiniz:
Python:
sonuc = (
veri.groupby("departman", as_index=False)["ciro"]
.sum()
.rename(columns={"ciro": "toplam_ciro"})
)
Birden fazla sütunla gruplama da mümkündür. Örneğin satışları hem departmana hem de ürüne göre hesaplamak için
groupby(["departman", "urun"]) kullanılır. Her iki sütunun birleşimi ayrı bir grup kabul edilir.agg, transform ve apply arasındaki fark
Hangi yöntemi seçeceğiniz, hesaplama sonucunun satır sayısını nasıl etkilemesini istediğinize bağlıdır.
| Yöntem | Sonuç biçimi | Uygun kullanım |
|---|---|---|
| agg | Her grup için genellikle tek satır | Toplam, ortalama, en büyük veya en küçük değer |
| transform | İlk veriyle aynı satır sayısı | Grup toplamını veya ortalamasını her satıra ekleme |
| apply | Özel kurala bağlı | Standart toplulaştırmaların yetmediği işlemler |
transform() kullanın. agg() burada uygun değildir; çünkü agg() grupları tek satıra indirgerken transform() özgün satır yapısını korur.
Python:
veri["departman_toplam_cirosu"] = (
veri.groupby("departman")["ciro"].transform("sum")
)
print(veri[["departman", "urun", "ciro", "departman_toplam_cirosu"]])
Örneğin Teknoloji grubundaki üç satırın her birinde
departman_toplam_cirosu değeri 16400 görünür. Bu, her satırın cirosunun 16.400 olduğu anlamına gelmez; yalnızca satırın ait olduğu grubun toplamını gösterir.Grupları hesaplama sonucuna göre seçme
Önce grup bazında hesaplama yapıp ardından belirli bir koşulu sağlayan grupları seçebilirsiniz. Örneğin toplam cirosu 10.000’den fazla olan departmanları bulmak için:
- Veriyi hesaplanabilir hâle getirin. Ciro gibi bir değer kullanacaksanız ilgili sütunun sayısal olduğundan ve gerekiyorsa adet ile birim fiyatın çarpımından oluşturulduğundan emin olun.
- Grupları oluşturun ve toplulaştırın.
groupby("departman", as_index=False)ile departmanları gruplayıpagg()içinde toplam ciroyu hesaplayın. - Koşula uyan grupları filtreleyin. Hesaplama tamamlandıktan sonra
sonuc[sonuc["toplam_ciro"] > 10000]ifadesini kullanın; bu işlem yalnızca grup sonuçlarını döndürür. - Sonucu kontrol edin. Dönen satırların grup bazında tekilleştiğini ve koşul sütununun gerçekten hesaplanan değer olduğunu kontrol edin. Hiç satır dönmemesi, hesaplamanın bozuk olduğunu değil, koşulu sağlayan grup bulunmadığını gösterir.
Python:
grup_sonucu = (
veri.groupby("departman", as_index=False)
.agg(toplam_ciro=("ciro", "sum"))
)
buyuk_departmanlar = grup_sonucu[
grup_sonucu["toplam_ciro"] > 10000
]
print(buyuk_departmanlar)
Eksik değerler varsa kullanılan hesaplama sonucu değişebilir.
mean() varsayılan olarak eksik sayısal değerleri dışarıda bırakır; count() seçilen sütundaki eksik olmayan değerleri, size() ise gruptaki tüm satırları sayar. Bu ayrım resmî pandas istatistik dersinde açıklanır. Gruplama anahtarındaki eksik değerler ise ayrı bir konudur: varsayılan dropna=True bunları grup sonucundan çıkarır; dahil etmek için dropna=False kullanın. Parametre ayrıntıları resmî groupby belgesindedir. Bu nedenle beklenmeyen sonuçta önce isna().sum() ile ilgili sütunlardaki eksik değerleri, ardından sütun türlerini dtypes ile kontrol edin. Metin olarak tutulan sayısal değerler hesaplamadan önce uygun biçimde sayısala dönüştürülmelidir.