apply() dengan GroupBy
Teruskan fungsi multi-baris ke groupby().apply() untuk menghitung ringkasan tingkat grup yang kompleks dan tidak dapat dinyatakan dengan agg().
apply() dengan GroupBy adalah pelajaran Pandas & NumPy Academy gratis di CoddyKit. Ini adalah pelajaran 2 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.
Mengapa GroupBy Memerlukan apply()
Metode bawaan agg() menangani agregasi sederhana seperti sum, mean, dan count—satu output skalar untuk setiap grup. Namun, beberapa penghitungan tingkat grup mengharuskan Anda melihat seluruh sub-DataFrame untuk grup tersebut, bukan hanya satu kolom. groupby().apply(func) meneruskan DataFrame lengkap dari setiap grup ke fungsi Anda dan mengumpulkan hasilnya, sehingga memungkinkan pembuatan ringkasan kompleks yang tidak dapat dinyatakan dengan agg().
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)Mengembalikan Skalar untuk Setiap Grup
Ketika fungsi yang diteruskan ke groupby().apply() mengembalikan skalar, hasilnya adalah Series yang diindeks berdasarkan kunci grup—sama seperti hasil dari agg(). Bentuk ini berguna ketika skalar memerlukan logika yang melibatkan beberapa kolom, seperti menghitung rasio pendapatan produk teratas terhadap total pendapatan grup, yang tidak dapat dinyatakan dalam satu spesifikasi kolom agg().
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)Mengembalikan Series untuk Setiap Grup
Ketika fungsi mengembalikan pd.Series, hasilnya memiliki MultiIndex: tingkat luar adalah kunci grup dan tingkat dalam adalah indeks Series. Ini berguna untuk menghitung beberapa statistik per grup dalam satu pemanggilan apply, sehingga menghasilkan tabel ringkasan dengan beberapa baris metrik untuk setiap grup.
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)Mengembalikan DataFrame untuk Setiap Grup
Ketika fungsi mengembalikan pd.DataFrame, groupby().apply() menggabungkan semua sub-DataFrame secara vertikal. Ini adalah bentuk yang paling fleksibel: Anda dapat memfilter atau mengubah baris dalam setiap grup, lalu mengembalikan subset yang telah diubah. Contohnya, pertahankan hanya 2 produk teratas berdasarkan pendapatan dalam setiap wilayah.
def top2_per_region(group):
return group.nlargest(2, 'revenue')
top2 = df.groupby('region').apply(top2_per_region)
print(top2.reset_index(drop=True))Menghitung Z-Score dalam Grup
Salah satu penggunaan umum groupby().apply() adalah menghitung standardisasi dalam grup. Daripada menormalisasi pendapatan relatif terhadap semua pesanan, yang mencampurkan berbagai wilayah, hitung Z-score pendapatan dalam setiap wilayah. Z-score sebesar 2 di wilayah Utara berarti "2 deviasi standar di atas rata-rata wilayah Utara"—tolok ukur yang lebih bermakna daripada 2 deviasi standar di atas rata-rata global.
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)Agregasi Khusus: Rata-Rata Winsor
Rata-rata Winsor memangkas nilai ekstrem sebelum menghitung rata-rata, sehingga lebih tahan terhadap distribusi yang menceng daripada rata-rata biasa. Agregasi khusus ini tidak dapat dinyatakan dengan fungsi standar agg(), tetapi mudah dilakukan dengan groupby().apply(): lakukan pemangkasan pada persentil ke-5 dan ke-95 dalam setiap grup, lalu hitung rata-rata dari nilai yang telah dipangkas.
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)Menghitung Jendela Bergulir Khusus per Grup
Jendela bergulir yang diterapkan pada seluruh DataFrame mengabaikan batas grup. Jika Anda menghitung rata-rata bergulir 3 baris pada deret waktu yang menyelang-nyelingkan dua produk, jendela tersebut melintasi batas produk secara keliru. Terapkan jendela bergulir di dalam groupby().apply() untuk memastikan setiap penghitungan bergulir tetap berada dalam grupnya—misalnya, rata-rata pendapatan bergulir 3 bulan untuk setiap wilayah.
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()')Parameter include_groups (Pandas 2.2+)
Pada Pandas 2.2 dan versi setelahnya, groupby().apply() memunculkan FutureWarning jika kunci groupby terdapat dalam DataFrame yang diterima fungsi. Teruskan include_groups=False untuk mengecualikan kolom groupby dari sub-DataFrame yang diteruskan ke fungsi. Dengan demikian, peringatan dan operasi yang tidak disengaja pada kolom kunci di dalam badan fungsi dapat dihindari.
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+')Menggabungkan Hasil apply() dengan reset_index
Ketika groupby().apply() mengembalikan DataFrame untuk setiap grup, hasilnya memiliki MultiIndex yang menyertakan kunci grup sebagai tingkat luar. Gunakan reset_index(drop=True) untuk meratakan indeks kembali menjadi rentang bilangan bulat biasa. Sebagai alternatif, gunakan reset_index(level=0) untuk mengubah kunci grup menjadi kolom agar terlihat jelas dalam output.
result = df.groupby('region').apply(top2_per_region)
print('With MultiIndex:')
print(result.head())
print('\nAfter reset_index:')
print(result.reset_index(drop=True))Kapan Memilih transform() daripada apply()
groupby().apply() digunakan untuk penghitungan tingkat grup yang kompleks dan menghasilkan bentuk berbeda dari input. groupby().transform() digunakan untuk penghitungan yang menambahkan kolom baru dengan keselarasan terhadap indeks asli—misalnya, menyebarkan rata-rata grup kembali ke setiap baris untuk normalisasi. Gunakan transform saat Anda memerlukan hasil dengan bentuk yang sama seperti DataFrame asli; gunakan apply saat bentuk hasil berbeda.
# 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']])Tips Kinerja: Hindari apply() untuk Agregasi Sederhana
groupby().apply() jauh lebih lambat daripada groupby().agg() untuk operasi sederhana karena apply() membuat objek Python lengkap untuk setiap grup. Untuk jumlah, rata-rata, dan hitungan, selalu gunakan agg(). Simpan apply() untuk kasus yang benar-benar memerlukan DataFrame grup lengkap—logika bersyarat yang melibatkan beberapa kolom, statistik khusus, atau pemfilteran dalam grup.
# 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))Pemeriksaan Singkat
Uji pemahaman Anda tentang konsep Analisis Data dari pelajaran ini.
Ringkasan Pelajaran
Dalam pelajaran ini, Anda telah mempelajari: mengembalikan skalar, Series, dan DataFrames dari groupby().apply(), menghitung Z-score dalam grup dan statistik khusus yang tangguh, serta memilih antara apply(), agg(), dan transform() untuk operasi tingkat grup. Selanjutnya, kita akan mempelajari map() dan applymap() untuk operasi per elemen pada Series dan DataFrames.
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 “apply() dengan GroupBy” gratis?
Ya — teks lengkap “apply() dengan 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 “apply() dengan GroupBy”?
Teruskan fungsi multi-baris ke groupby().apply() untuk menghitung ringkasan tingkat grup yang kompleks dan tidak dapat dinyatakan dengan agg(). 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 2 dari 4.
Berapa lama pelajaran “apply() dengan 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
- apply() pada Kolom dan Baris
- apply() dengan GroupBy
- map() dan applymap() untuk Operasi Per Elemen
- Perangkaian Metode dengan pipe()