GroupBy ile apply()
agg() ile ifade edilemeyen karmaşık grup düzeyi özetlerini hesaplamak için çok satırlı bir işlevi groupby().apply() işlevine aktarın.
GroupBy ile apply(), CoddyKit'te ücretsiz bir Pandas & NumPy Academy dersidir. Bu, 4 dersinin 2. 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.
GroupBy Neden apply() Gerektirir
Yerleşik agg() yöntemi sum, mean ve count gibi basit toplulaştırmaları, yani grup başına tek bir skaler çıktıyı işler. Ancak bazı grup düzeyindeki hesaplamalar yalnızca tek bir sütuna değil, grubun tamamına ait alt DataFrame'e bakmayı gerektirir. groupby().apply(func), grubun tamamına ait DataFrame'i işlevinize aktarır ve sonuçları toplar; böylece agg() ile ifade edilemeyen karmaşık özetlerin oluşturulmasını sağlar.
import pandas as pd
import numpy as np
df = pd.DataFrame({
'region': ['North', 'North', 'South', 'South', 'North'],
'product': ['A', 'B', 'A', 'A', 'C'],
'revenue': [100, 250, 180, 90, 300]
})
print(df)Grup Başına Skaler Döndürme
groupby().apply() işlevine aktarılan işlev bir skaler döndürdüğünde sonuç, grup anahtarlarına göre dizinlenmiş bir Series olur ve agg() ile üretilen sonuçla aynıdır. Bu biçim, en çok satan ürünün gelirinin toplam grup gelirine oranını hesaplamak gibi, birden çok sütun mantığı gerektiren ve tek bir agg() sütun tanımıyla ifade edilemeyen durumlarda kullanışlıdır.
def top_product_share(group):
top = group['revenue'].max()
total = group['revenue'].sum()
return top / total
share = df.groupby('region').apply(top_product_share)
print(share)Grup Başına Series Döndürme
İşlev bir pd.Series döndürdüğünde sonuç bir MultiIndex'e sahip olur: dış düzey grup anahtarı, iç düzey ise Series dizinidir. Bu yöntem, tek bir apply çağrısında grup başına birden çok istatistik hesaplamak ve her grubun birden çok ölçüm satırına sahip olduğu bir özet tablosu oluşturmak için kullanışlıdır.
def group_stats(group):
return pd.Series({
'total': group['revenue'].sum(),
'top_product': group.loc[group['revenue'].idxmax(), 'product'],
'n_products': group['product'].nunique()
})
result = df.groupby('region').apply(group_stats)
print(result)Grup Başına DataFrame Döndürme
İşlev bir pd.DataFrame döndürdüğünde groupby().apply() tüm alt DataFrame'leri dikey olarak birleştirir. Bu en güçlü biçimdir: her grup içindeki satırları filtrelemenize veya dönüştürmenize ve değiştirilmiş bir alt küme döndürmenize olanak tanır. Örneğin, her bölgedeki gelire göre en yüksek 2 ürünü tutabilirsiniz.
def top2_per_region(group):
return group.nlargest(2, 'revenue')
top2 = df.groupby('region').apply(top2_per_region)
print(top2.reset_index(drop=True))Grup İçi Z Puanlarını Hesaplama
groupby().apply() kullanımının yaygın bir amacı, grup içi standartlaştırma yapmaktır. Geliri tüm siparişlere göre normalleştirmek (böylece bölgeleri birbirine karıştırmak) yerine gelirin her bölge içindeki Z puanını hesaplayın. North bölgesindeki 2 Z puanı, "North ortalamasının 2 standart sapma üstünde" anlamına gelir; bu, küresel ortalamanın 2 standart sapma üstünde olmaktan daha anlamlı bir karşılaştırma ölçütüdür.
def within_group_zscore(group):
mean = group['revenue'].mean()
std = group['revenue'].std()
group = group.copy()
group['revenue_z'] = (group['revenue'] - mean) / std
return group
df_z = df.groupby('region').apply(within_group_zscore).reset_index(drop=True)
print(df_z)Özel Toplulaştırma: Winsorised Mean
Winsorised mean, ortalamayı almadan önce uç değerleri sınırlar; bu nedenle çarpık dağılımlarda basit ortalamaya göre daha dayanıklıdır. Bu özel toplulaştırma, standart agg() işlevleriyle ifade edilemez; ancak groupby().apply() ile kolayca yapılabilir: her grup içindeki 5. ve 95. yüzdelik değerlerde sınırlandırma uygulayın, ardından sınırlandırılmış değerlerin ortalamasını hesaplayın.
def winsorised_mean(group, lower_pct=0.05, upper_pct=0.95):
col = group['revenue']
lo = col.quantile(lower_pct)
hi = col.quantile(upper_pct)
clipped = col.clip(lo, hi)
return clipped.mean()
wins_mean = df.groupby('region').apply(winsorised_mean)
print('Winsorised mean by region:')
print(wins_mean)Grup Başına Özel Kayan Pencere
Tam DataFrame üzerine uygulanan kayan pencereler grup sınırlarını yok sayar. İki ürünün iç içe geçtiği bir zaman serisi üzerinde 3 satırlık kayan ortalama hesaplarsanız pencere ürün sınırlarını yanlış biçimde aşar. Her kayan hesaplamanın kendi grubu içinde kalmasını sağlamak için kayan pencereyi bir groupby().apply() içinde uygulayın — örneğin bölge başına 3 aylık kayan gelir ortalaması hesaplayabilirsiniz.
def group_rolling_mean(group, window=3):
group = group.sort_values('order_date').copy()
group['rolling_revenue'] = group['revenue'].rolling(window, min_periods=1).mean()
return group
# df_ts has order_date column
# df_rolled = df_ts.groupby('region').apply(group_rolling_mean).reset_index(drop=True)
print('Rolling window per group applied inside apply()')include_groups Parametresi (Pandas 2.2+)
Pandas 2.2 ve sonraki sürümlerde, işlevin aldığı DataFrame içinde groupby anahtarları bulunduğunda groupby().apply() bir FutureWarning verir. İşleve aktarılan alt DataFrame içinden groupby sütunlarını çıkarmak için include_groups=False geçirin. Böylece hem uyarıyı hem de işlev gövdesinde anahtar sütunlar üzerinde yanlışlıkla işlem yapılmasını önlersiniz.
def revenue_only(group):
# group does not include 'region' column when include_groups=False
return group['revenue'].sum()
# result = df.groupby('region').apply(revenue_only, include_groups=False)
print('include_groups=False avoids FutureWarning in Pandas 2.2+')apply() Sonuçlarını reset_index ile Birleştirme
groupby().apply() her grup için bir DataFrame döndürdüğünde, sonuçta dış düzey olarak grup anahtarını içeren bir MultiIndex bulunur. İndeksi yeniden basit bir tamsayı aralığına dönüştürmek için reset_index(drop=True) kullanın. Alternatif olarak, grup anahtarını bir sütuna dönüştürüp çıktıda açıkça göstermek için reset_index(level=0) kullanabilirsiniz.
result = df.groupby('region').apply(top2_per_region)
print('With MultiIndex:')
print(result.head())
print('\nAfter reset_index:')
print(result.reset_index(drop=True))apply() Yerine transform() Ne Zaman Tercih Edilmeli
groupby().apply(), girdiden farklı bir biçim döndüren karmaşık grup düzeyi hesaplamalar için kullanılır. groupby().transform() ise özgün indeksle hizalanmış yeni bir sütun ekleyen hesaplamalar içindir; örneğin grup ortalamasını normalleştirme amacıyla her satıra yaymak gibi. Sonucun özgün DataFrame ile aynı biçimde olmasını istediğinizde transform, sonuç biçimi farklı olduğunda ise apply kullanın.
# transform: adds group mean back to each row
df['group_mean_revenue'] = df.groupby('region')['revenue'].transform('mean')
# apply: computes one scalar per group
group_totals = df.groupby('region')['revenue'].apply(sum)
print(df[['region', 'revenue', 'group_mean_revenue']])Performans İpucu: Basit Toplamalar İçin apply() Kullanmayın
Basit işlemlerde groupby().apply(), groupby().agg() işleminden önemli ölçüde daha yavaştır; çünkü apply() her grup için eksiksiz bir Python nesnesi oluşturur. Toplamlar, ortalamalar ve sayımlar için her zaman agg() kullanın. apply() kullanımını yalnızca tam grup DataFrame'inin gerçekten gerekli olduğu durumlara ayırın: birden çok sütun içeren koşullu mantık, özel istatistikler veya gruplar içinde filtreleme gibi.
# SLOW: apply for simple sum
slow = df.groupby('region').apply(lambda g: g['revenue'].sum())
# FAST: native agg
fast = df.groupby('region')['revenue'].sum()
print('Both produce the same result:')
print(fast.equals(slow))Kısa Kontrol
Bu dersteki Veri Analizi kavramlarını anlayıp anlamadığınızı test edin.
Ders Özeti
Bu derste şunları öğrendiniz: groupby().apply() işlevinden skaler değerler, Series ve DataFrame döndürme, grup içi Z skorları ve özel dayanıklı istatistikler hesaplama ve grup düzeyi işlemler için apply(), agg() ve transform() arasında seçim yapma. Sırada, Series ve DataFrame üzerinde öğe bazında işlemler için map() ve applymap() işlevlerini inceleyeceğiz.
Sıkça Sorulan Sorular
“GroupBy ile apply()” dersi ücretsiz mi?
Evet — “GroupBy ile apply()” 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.
“GroupBy ile apply()” dersinde ne öğreneceğim?
agg() ile ifade edilemeyen karmaşık grup düzeyi özetlerini hesaplamak için çok satırlı bir işlevi groupby().apply() işlevine aktarın. 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 2. dersidir.
“GroupBy ile apply()” 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
- Sütunlar ve Satırlarda apply()
- GroupBy ile apply()
- Öğe Bazlı İşlemler için map() ve applymap()
- pipe() ile Yöntem Zincirleme