Pandas & NumPy Academy · Pelajaran

Transformasi dan Filter GroupBy

Gunakan transform() untuk menambahkan statistik tingkat grup kembali sebagai kolom dan filter() untuk mempertahankan hanya grup yang memenuhi kondisi.

Pelajaran 4 dari 413 langkah

Transformasi dan Filter GroupBy adalah pelajaran Pandas & NumPy Academy gratis di CoddyKit. Ini adalah pelajaran 4 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Pandas & NumPy Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Pandas & NumPy Academy mencakup 4 pelajaran total.

Melampaui Agregasi

Setelah menguasai agg(), pertanyaan yang wajar adalah: bagaimana jika Anda ingin mempertahankan semua baris asli, tetapi memperkayanya dengan statistik tingkat grup? Atau hanya mempertahankan grup yang memenuhi suatu kondisi? Di sinilah transform() dan filter() digunakan. Kedua metode ini memperluas kemampuan GroupBy, dari sekadar membuat ringkasan menjadi rekayasa fitur dan pemilihan data.

Memahami transform()

transform() menerapkan suatu fungsi pada setiap grup dan mengembalikan hasil dengan bentuk yang sama seperti DataFrame asli — satu nilai untuk setiap baris asli. Hasil grup tersebut disebarkan kembali ke setiap baris yang termasuk dalam grup tersebut. Hal ini membuatnya ideal untuk menambahkan statistik tingkat grup sebagai kolom baru tanpa mengubah jumlah baris.

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

Kasus Penggunaan transform() yang Umum

Penerapan umum transform() meliputi: menambahkan rata-rata grup untuk menormalkan nilai, menambahkan jumlah grup untuk menghitung persentase total per baris, serta menambahkan peringkat grup untuk melihat perbandingan setiap anggota di dalam grupnya. Semua penerapan ini mempertahankan bentuk dan indeks asli, sehingga hasilnya dapat langsung digunakan bersama kolom asli.

# 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

Menggunakan Fungsi Khusus dalam transform()

Sama seperti agg(), transform() menerima fungsi apa pun yang dapat dipanggil selain nama string. Fungsi tersebut menerima sebuah Series berisi nilai untuk satu grup dan harus mengembalikan Series dengan panjang yang sama, atau nilai skalar yang kemudian disebarkan. Mengembalikan nilai skalar adalah kasus penggunaan yang paling umum — mengembalikan Series dengan panjang berbeda akan menimbulkan kesalahan.

# 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() vs transform() Berdampingan

Perbedaan utamanya: agg() mengurangi jumlah baris, yaitu satu baris per grup, sedangkan transform() mempertahankan jumlah baris, yaitu satu baris untuk setiap baris asli. Gunakan agg() untuk membuat tabel ringkasan. Gunakan transform() untuk menambahkan informasi tingkat grup sebagai kolom fitur baru pada DataFrame asli.

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

Memahami filter()

filter() mempertahankan atau membuang seluruh grup berdasarkan fungsi boolean. Anda meneruskan fungsi yang menerima sub-DataFrame untuk satu grup dan mengembalikan True (pertahankan grup) atau False (buang grup). Hasilnya adalah subset dari DataFrame asli yang hanya berisi baris dari grup yang lolos pengujian.

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

Memfilter Berdasarkan Nilai Agregat Grup

Penggunaan filter() yang sangat umum adalah mempertahankan grup yang nilai agregatnya memenuhi ambang batas. Misalnya, mempertahankan hanya departemen yang gaji rata-ratanya melebihi target, atau hanya kategori produk dengan total penjualan di atas batas minimum. Dengan cara ini, Anda dapat menghapus grup dengan volume rendah sebelum melakukan analisis lebih lanjut.

# 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)

Menggabungkan transform() dan filter()

Anda dapat menerapkan transform() dan filter() secara berurutan untuk memperkaya data, lalu mempersempit hasilnya. Pertama, gunakan filter() untuk menghapus grup yang tidak relevan, kemudian gunakan transform() pada hasil yang telah difilter untuk menambahkan fitur tingkat grup. Kombinasi ini menghasilkan subset data yang rapi dan kaya fitur, siap digunakan untuk pemodelan atau pelaporan.

# 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)

transform() untuk Mengisi Nilai ke Depan dalam Grup

transform() juga berguna dengan fungsi nonsnumerik. Pola yang populer adalah mengisi nilai yang hilang di dalam suatu grup menggunakan pengisian ke depan atau median grup tersebut, yang jauh lebih baik daripada pengisian global. Teruskan lambda yang memanggil fillna() pada Series grup, dan hasilnya akan memiliki indeks yang sama seperti DataFrame asli.

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)

Pola Praktis: Posisi Relatif

Salah satu kasus penggunaan bisnis yang bermanfaat adalah menghitung posisi setiap baris relatif terhadap grupnya. Dengan menggabungkan transform() dan operasi aritmetika, Anda dapat menambahkan kolom seperti: gaji dikurangi rata-rata grup (deviasi), gaji sebagai bagian dari total grup, atau penanda boolean yang menunjukkan apakah karyawan tersebut memperoleh gaji di atas median grup. Fitur-fitur ini sangat berguna untuk dasbor dan model ML.

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']])

Pertimbangan Performa

transform() dan filter() dengan fungsi string bawaan sama-sama cepat karena menggunakan jalur kode yang dioptimalkan. Namun, saat Anda meneruskan lambda atau fungsi Python khusus, Pandas harus memanggil fungsi tersebut satu kali untuk setiap grup, yang dapat lambat pada data dengan banyak grup. Untuk mendapatkan performa maksimum pada kumpulan data besar, periksa apakah logika khusus Anda dapat ditulis menggunakan fungsi string bawaan.

# 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

Pemeriksaan Singkat

Uji pemahaman Anda tentang transform() dan filter() pada GroupBy dari pelajaran ini.

Ringkasan Pelajaran

Dalam pelajaran ini Anda mempelajari bahwa transform() mengembalikan statistik grup yang disebarkan kembali hingga jumlah baris asli, sehingga ideal untuk menambahkan fitur tingkat grup; filter() mempertahankan atau menghapus seluruh grup berdasarkan kondisi boolean; dan menggabungkan keduanya memungkinkan Anda membuat kumpulan data yang kaya dan telah difilter untuk analisis lanjutan. Selanjutnya, kita akan mempelajari cara menggabungkan DataFrame menggunakan pd.concat.

Gratis untuk memulai

Belajar Python dengan tutor AI — gratis

Tulis dan jalankan kode asli di browser kamu, dapatkan bantuan instan dari tutor AI 24/7, dan lanjutkan di mana kamu tinggalkan di web atau aplikasi.

Kursus
30
Pelajaran
120

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Transformasi dan Filter GroupBy” gratis?

Ya — teks lengkap “Transformasi dan Filter GroupBy” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Pandas & NumPy Academy, upgrade ke CoddyKit PRO. Kursus Pandas & NumPy Academy mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Transformasi dan Filter GroupBy”?

Gunakan transform() untuk menambahkan statistik tingkat grup kembali sebagai kolom dan filter() untuk mempertahankan hanya grup yang memenuhi kondisi. Kamu berlatih Pandas & NumPy Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai Pandas & NumPy Academy?

Tidak diperlukan pengalaman sebelumnya. Pandas & NumPy Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 4 dari 4.

Berapa lama pelajaran “Transformasi dan Filter GroupBy” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran Pandas & NumPy Academy ini?

Ya. Setiap pelajaran Pandas & NumPy Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Pola Pisahkan-Terapkan-Gabungkan
  2. GroupBy dengan Satu dan Beberapa Kunci
  3. Metode agg()
  4. Transformasi dan Filter GroupBy
← Kembali ke Pandas & NumPy Academy