Pandas & NumPy Academy · Ders

GroupBy Dönüşümü ve Filtreleme

Grup düzeyindeki istatistikleri sütun olarak geri eklemek için transform() kullanın; bir koşulu karşılayan grupları tutmak için filter() kullanın.

4. ders / 413 adım

GroupBy Dönüşümü ve Filtreleme, CoddyKit'te ücretsiz bir Pandas & NumPy Academy dersidir. Bu, 4 dersinin 4. 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.

Toplamanın Ötesinde

agg() konusunda ustalaştıktan sonra şu doğal soru ortaya çıkar: tüm özgün satırları korurken bunları grup düzeyindeki istatistiklerle zenginleştirmek isterseniz ne yapmalısınız? Ya da yalnızca bir koşulu karşılayan grupları tutmak isterseniz? Bu noktada transform() ve filter() devreye girer. Bu iki yöntem, GroupBy'ı basit özetlemenin ötesine taşıyarak özellik mühendisliği ve veri seçimi yapmanızı sağlar.

transform() İşlevini Anlama

transform(), her gruba bir işlev uygular ve orijinal DataFrame ile aynı şekle sahip bir sonuç döndürür — her orijinal satır için bir değer. Grup sonucu, o gruba ait her satıra geri yayınlanır. Bu sayede satır sayısını değiştirmeden grup düzeyindeki istatistikleri yeni sütunlar olarak eklemek için ideal bir yöntemdir.

import pandas as pd

df = pd.DataFrame({
    'dept':   ['Eng', 'HR', 'Eng', 'HR', 'Eng'],
    'salary': [90000, 60000, 95000, 62000, 88000]
})

# Add a column with each employee's department average salary
df['dept_avg'] = df.groupby('dept')['salary'].transform('mean')
print(df)
#    dept  salary    dept_avg
# 0   Eng   90000  91000.000
# 1    HR   60000  61000.000
# 2   Eng   95000  91000.000
# 3    HR   62000  61000.000
# 4   Eng   88000  91000.000

transform() için yaygın kullanım alanları

transform() için yaygın uygulamalar şunlardır: değerleri normalleştirmek için grup ortalamasını eklemek, toplam içindeki satır başına yüzdeyi hesaplamak için grup toplamını eklemek ve her üyenin kendi grubu içindeki konumunu görmek için grup sıralamasını eklemek. Bunların tümü orijinal şekli ve dizini korur; böylece sonuç, orijinal sütunlarla birlikte hemen kullanılabilir.

# Percentage of each employee's salary within their department total
df['pct_of_dept'] = (
    df['salary'] / df.groupby('dept')['salary'].transform('sum') * 100
).round(1)
print(df[['dept', 'salary', 'pct_of_dept']])
# dept  salary  pct_of_dept
# Eng   90000        33.1
# HR    60000        49.2
# Eng   95000        34.9

transform() içinde özel işlev kullanma

agg() gibi transform() da dize adlarına ek olarak çağrılabilir herhangi bir işlevi kabul eder. İşlev, bir gruba ait değerlerin Series nesnesini alır ve aynı uzunlukta bir Series ya da bir skaler değer döndürmelidir; skaler değer daha sonra yayınlanır. En yaygın kullanım skaler değer döndürmektir — farklı uzunlukta bir Series döndürmek hataya neden olur.

# Z-score normalisation within each department
def zscore(s):
    return (s - s.mean()) / s.std()

df['salary_zscore'] = df.groupby('dept')['salary'].transform(zscore)
print(df[['dept', 'salary', 'salary_zscore']].round(2))
# dept  salary  salary_zscore
# Eng   90000          -0.51
# HR    60000          -0.71
# Eng   95000           1.03

agg() ve transform() karşılaştırması

Temel fark şudur: agg() satır sayısını azaltır (grup başına bir satır), transform() ise satır sayısını korur (her orijinal satır için bir satır). Özet tablosu oluşturmak için agg() kullanın. Orijinal DataFrame'e yeni bir özellik sütunu olarak grup düzeyinde bilgi eklemek için transform() kullanın.

g = df.groupby('dept')['salary']

# agg: 2 rows (one per unique dept)
print(g.agg('mean'))
# dept
# Eng    91000.0
# HR     61000.0

# transform: 5 rows (one per original row)
print(g.transform('mean'))
# 0    91000.0
# 1    61000.0
# 2    91000.0
# 3    61000.0
# 4    91000.0

filter() işlevini anlama

filter(), bir boole işlevine göre grupların tamamını tutar veya eler. Bir gruba ait alt DataFrame'i alan ve True (grubu tut) ya da False (grubu ele) döndüren bir işlev verirsiniz. Sonuç, yalnızca testi geçen gruplardaki satırları içeren orijinal DataFrame'in bir alt kümesidir.

df2 = pd.DataFrame({
    'dept':   ['Eng', 'HR', 'Eng', 'HR', 'Eng', 'Legal'],
    'salary': [90000, 60000, 95000, 62000, 88000, 70000]
})

# Keep only departments with at least 2 employees
big_depts = df2.groupby('dept').filter(lambda g: len(g) >= 2)
print(big_depts)
# dept, salary rows: Eng(3) and HR(2) remain; Legal(1) dropped

Grup toplama değerine göre filtreleme

filter() işlevinin çok yaygın bir kullanımı, toplama değeri belirli bir eşiği karşılayan grupları tutmaktır. Örneğin, yalnızca ortalama maaşı belirlenen hedefi aşan departmanları veya toplam satışları asgari değerin üzerinde olan ürün kategorilerini tutabilirsiniz. Bu, daha ileri analizden önce düşük hacimli grupları kaldırmanızı sağlar.

# Keep only departments where average salary > 80000
high_paying = df2.groupby('dept').filter(
    lambda g: g['salary'].mean() > 80000
)
print(high_paying)
#    dept  salary
# 0   Eng   90000
# 2   Eng   95000
# 4   Eng   88000
# (HR avg is 61000, filtered out)

transform() ve filter() işlevlerini birleştirme

Verilerinizi zenginleştirmek ve ardından daraltmak için transform() ve filter() işlevlerini sıralı olarak uygulayabilirsiniz. Önce ilgisiz grupları kaldırmak için filter() kullanın, ardından filtrelenmiş sonuç üzerinde grup düzeyindeki özellikleri eklemek için transform() kullanın. Bu birleşim, modelleme veya raporlama için hazır, temiz ve zengin özelliklere sahip bir alt küme sağlar.

# Step 1: keep only large departments
filtered = df2.groupby('dept').filter(lambda g: len(g) >= 2)

# Step 2: add group mean salary to the filtered result
filtered = filtered.copy()
filtered['dept_avg'] = filtered.groupby('dept')['salary'].transform('mean')
print(filtered)

Gruplar içinde ileriye doğru doldurma için transform()

transform(), sayısal olmayan işlevlerle de kullanışlıdır. Yaygın bir yaklaşım, eksik değerleri bir grup içinde o grubun ileriye doğru doldurma yöntemiyle veya medyanıyla doldurmaktır; bu, genel bir doldurmadan çok daha iyidir. Grup Series'i üzerinde fillna() çağıran bir lambda iletin; sonuç, orijinal DataFrame ile aynı dizine sahip olur.

import numpy as np

df3 = pd.DataFrame({
    'dept':   ['Eng', 'Eng', 'HR', 'HR', 'Eng'],
    'salary': [90000, np.nan, 60000, np.nan, 88000]
})

# Fill NaN with the group mean
df3['salary_filled'] = df3.groupby('dept')['salary'].transform(
    lambda s: s.fillna(s.mean())
)
print(df3)

Uygulamalı yaklaşım: göreli konum

Güçlü bir iş kullanımı, her satırın kendi grubuna göre konumunu hesaplamaktır. transform() işlevini aritmetik işlemlerle birleştirerek şu tür sütunlar ekleyebilirsiniz: grup ortalamasından çıkarılmış maaş (sapma), grup toplamının bir kesri olarak maaş veya bu çalışanın grup medyanından daha fazla kazanıp kazanmadığını belirten boole işareti. Bu özellikler, gösterge panoları ve makine öğrenmesi modelleri için son derece kullanışlıdır.

df['dept_total'] = df.groupby('dept')['salary'].transform('sum')
df['pct_of_total'] = (df['salary'] / df['dept_total'] * 100).round(1)
df['above_avg'] = df['salary'] > df.groupby('dept')['salary'].transform('mean')
print(df[['dept', 'salary', 'pct_of_total', 'above_avg']])

Performansla ilgili noktalar

Yerleşik dize işlevleriyle kullanılan transform() ve filter() hızlıdır; çünkü optimize edilmiş kod yollarını kullanırlar. Ancak bir lambda veya özel Python işlevi ilettiğinizde Pandas, çok sayıda grup içeren verilerde yavaş olabilen bu işlevi her grup için bir kez çağırmalıdır. Büyük veri kümelerinde en yüksek performans için özel mantığınızın bunun yerine yerleşik bir dize işleviyle ifade edilip edilemeyeceğini kontrol edin.

# Slower: custom lambda (called once per group)
df['dept_mean_slow'] = df.groupby('dept')['salary'].transform(lambda s: s.mean())

# Faster: built-in string shortcut (vectorised C path)
df['dept_mean_fast'] = df.groupby('dept')['salary'].transform('mean')

# Both give identical results, but the built-in is significantly faster

Kısa kontrol

Bu derste öğrendiğiniz GroupBy transform() ve filter() konusunu test edin.

Ders özeti

Bu derste şunları öğrendiniz: transform(), grup istatistiklerini orijinal satır sayısına geri yayınlanmış biçimde döndürür; bu da onu grup düzeyindeki özellikleri eklemek için ideal kılar; filter(), bir boole koşuluna göre grupların tamamını tutar veya kaldırır; bu ikisini birleştirmek, sonraki analizler için zengin ve filtrelenmiş veri kümeleri oluşturmanızı sağlar. Sırada, pd.concat kullanarak DataFrames nesnelerini birleştirmeyi inceleyeceğiz.

Başlamak ücretsiz

Yapay zeka eğitmeniyle Python öğren — ücretsiz

Tarayıcında gerçek kod yaz ve çalıştır, 7/24 yapay zeka eğitmeninden anında yardım al; web'de ya da uygulamada kaldığın yerden devam et.

Kurslar
30
Dersler
120

Sıkça Sorulan Sorular

“GroupBy Dönüşümü ve Filtreleme” dersi ücretsiz mi?

Evet — “GroupBy Dönüşümü ve Filtreleme” 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 Dönüşümü ve Filtreleme” dersinde ne öğreneceğim?

Grup düzeyindeki istatistikleri sütun olarak geri eklemek için transform() kullanın; bir koşulu karşılayan grupları tutmak için filter() kullanı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 4. dersidir.

“GroupBy Dönüşümü ve Filtreleme” 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

  1. Böl-Aygula-Birleştir Deseni
  2. Tek ve Birden Çok Anahtarla GroupBy
  3. agg() Yöntemi
  4. GroupBy Dönüşümü ve Filtreleme
← Pandas & NumPy Academy Sayfasına Dön