Pandas groupby agg: Banyak Agregasi Sekaligus
TL;DR
Method agg di pandas dipakai buat ngitung banyak agregasi sekaligus setelah groupby, misalnya total, rata-rata, dan jumlah baris dalam satu perintah. Cara paling rapi pakai named aggregation, formatnya nama_kolom_baru=('kolom_sumber', 'fungsi'). Pendekatan ini bikin hasil langsung punya nama kolom yang jelas, tanpa MultiIndex yang ribet.
Method agg di pandas dipakai buat ngitung banyak agregasi sekaligus setelah groupby, misalnya total, rata-rata, dan jumlah transaksi per kota dalam satu perintah.
Kalau kamu masih nulis groupby berkali-kali buat tiap ringkasan, ada cara yang jauh lebih ringkas. agg nampung semua perhitungan dalam satu panggilan, dan hasilnya langsung berupa tabel rapi.
Di artikel ini kamu bakal belajar named aggregation, cara pasang banyak fungsi ke satu kolom, dan contoh nyata dari data penjualan UMKM.
Apa itu agg di pandas groupby?
agg adalah method yang ngejalanin satu atau banyak fungsi agregasi ke tiap grup hasil groupby. Fungsi agregasi itu perhitungan yang ngeringkas banyak baris jadi satu angka, kayak sum, mean, count, min, atau max. Dengan agg, kamu bisa gabungin beberapa perhitungan itu dalam satu langkah.
Konsepnya sama kayak agregasi di SQL: kelompokkan dulu, baru hitung ringkasan per kelompok. Bedanya, pandas agg ngasih kamu kontrol penuh atas nama kolom hasilnya. Kalau kamu baru mulai dengan groupby, baca dulu dasar pandas groupby biar nyambung.
Gimana cara pakai named aggregation?
Named aggregation adalah cara paling rapi dan disarankan sejak pandas 0.25. Formatnya: tiap argumen berupa nama_kolom_baru sama dengan tuple (kolom_sumber, fungsi). Hasilnya DataFrame dengan nama kolom yang kamu tentuin sendiri.
import pandas as pd
ringkasan = df.groupby('kota').agg(
total_belanja=('nominal', 'sum'),
rata_belanja=('nominal', 'mean'),
jumlah_transaksi=('order_id', 'count')
)
print(ringkasan)
Tiap baris hasil adalah satu kota, dan tiga kolomnya persis nama yang kamu kasih. Nggak ada MultiIndex, nggak perlu rename lagi setelahnya. Ini keunggulan utama named aggregation dibanding cara lama.
Gimana cara pasang banyak fungsi ke satu kolom?
Kalau kamu mau beberapa perhitungan dari kolom yang sama, kamu bisa oper daftar fungsi ke agg. Cara ini lebih ringkas tapi hasilnya pakai MultiIndex di kolom, jadi butuh sedikit perapian.
ringkasan = df.groupby('kota')['nominal'].agg(['sum', 'mean', 'max', 'count'])
print(ringkasan)
Hasilnya empat kolom: sum, mean, max, dan count, semuanya dari kolom nominal. Kalau nama fungsi default kurang jelas, kamu bisa ratakan kolomnya biar gampang dibaca:
ringkasan.columns = ['total', 'rata', 'tertinggi', 'jumlah']
Gimana cara pakai fungsi custom di agg?
Selain fungsi bawaan, kamu bisa oper fungsi buatan sendiri lewat lambda. Ini berguna buat perhitungan yang nggak ada versi bawaannya, misalnya selisih nilai tertinggi dan terendah per grup.
ringkasan = df.groupby('kota').agg(
rentang=('nominal', lambda x: x.max() - x.min()),
median=('nominal', 'median')
)
lambda x itu fungsi kecil yang nerima nilai satu grup, lalu balikin satu angka. Di sini dia ngitung selisih max dan min. Fungsi custom bikin agg fleksibel buat kebutuhan yang spesifik.
Contoh kasus: ringkasan penjualan toko_berkah
Aku pakai dataset toko_berkah, data penjualan UMKM dengan 4 cabang di kota berbeda dan 2.800 baris transaksi selama satu kuartal. Aku mau satu tabel ringkasan per kota.
ringkasan = df.groupby('kota').agg(
total_omzet=('nominal', 'sum'),
rata_transaksi=('nominal', 'mean'),
jumlah_transaksi=('order_id', 'count')
).sort_values('total_omzet', ascending=False)
print(ringkasan)
Hasilnya nunjukin pola menarik. Cabang Bandung punya jumlah transaksi terbanyak (912 transaksi), tapi rata-rata belanjanya paling kecil, cuma Rp 47.300. Cabang Surabaya transaksinya lebih sedikit (610), tapi rata-rata belanja Rp 78.500, 66% lebih tinggi dari Bandung.
Insight ini nggak bakal kelihatan kalau cuma lihat total omzet. Bandung ramai tapi nilai kecil, Surabaya sepi tapi nilai besar. Strategi promonya jelas beda buat tiap cabang.
Kesalahan umum pakai agg
- Kaget sama MultiIndex. Cara pasang list fungsi bikin kolom bertingkat. Kalau bikin pusing, pindah ke named aggregation.
- Salah pilih count. count nggak ngitung nilai kosong. Kalau kamu mau semua baris termasuk yang null, pakai size.
- Nulis nama fungsi salah ketik. 'means' bukan fungsi, yang bener 'mean'. pandas bakal ngasih error.
- Lupa reset_index. Kolom grup jadi index. Kalau kamu butuh dia sebagai kolom biasa, tambahin .reset_index() di akhir.
FAQ
Pertanyaan yang sering muncul soal groupby agg di pandas.
Apa beda agg pakai named aggregation sama pakai dictionary?
Named aggregation pakai format nama_baru=('kolom', 'fungsi'), dan hasilnya langsung punya nama kolom yang kamu tentuin tanpa MultiIndex. Cara dictionary lama, kayak agg({'nominal': ['sum', 'mean']}), masih jalan tapi bikin kolom bertingkat yang harus dirapiin. Sejak pandas 0.25, named aggregation jadi cara yang disarankan karena lebih jelas dan gampang dibaca. Aku sendiri hampir selalu pakai yang named.
Kenapa count dan size ngasih hasil beda di groupby?
count cuma ngitung baris yang nilainya nggak kosong di kolom yang kamu pilih. size ngitung semua baris di grup itu, termasuk yang nilainya null. Jadi kalau kolommu ada data kosong, count bakal lebih kecil dari size. Kalau kamu mau tau jumlah total anggota tiap grup apa pun kondisinya, pakai size. Kalau kamu mau jumlah data yang valid aja, pakai count.
Gimana cara bikin kolom grup jadi kolom biasa lagi setelah agg?
Setelah groupby dan agg, kolom yang kamu pakai buat ngelompokkan otomatis jadi index DataFrame. Buat balikin dia jadi kolom biasa, tambahin .reset_index() di akhir rantai perintahmu. Ini penting kalau kamu mau merge hasilnya ke DataFrame lain atau ekspor ke Excel, karena index sering bikin ribet. Alternatifnya, oper as_index=False ke groupby biar hasilnya langsung berupa kolom.
Bisakah aku pakai fungsi buatan sendiri di agg?
Bisa. Kamu oper lambda atau nama fungsi yang kamu definisikan sebagai fungsi agregasinya. Fungsi itu nerima nilai satu grup dalam bentuk Series, lalu harus balikin satu angka. Contohnya lambda x: x.max() - x.min() buat ngitung rentang tiap grup. Ini berguna buat perhitungan yang nggak ada versi bawaannya di pandas. Pastiin fungsimu selalu ngembaliin satu nilai, bukan Series.
Penutup
agg bikin kamu ngerangkum data dalam satu perintah, bukan groupby berulang. Buat hasil yang paling rapi, pakai named aggregation dengan format nama_baru=('kolom', 'fungsi'). Buat perhitungan yang nggak ada bawaannya, oper lambda.
Sekali kamu terbiasa, bikin tabel ringkasan jadi kerjaan lima detik. Mau lanjut ke bentuk pivot? Baca pandas pivot_table buat susun ringkasan dua dimensi. Detail lengkap methodnya ada di dokumentasi resmi pandas agg. Mau latihan pandas terstruktur? Kulik materinya di NgulikData.
Mau praktek langsung? Mulai latihan SQL gratis
Latihan interaktif, langsung di browser.
Artikel terkait
NumPy arange dan linspace: Buat Deret Angka
NumPy arange bikin deret angka dengan langkah tetap, linspace dengan jumlah titik tetap. Aku bahas kapan pakai yang mana plus jebakan step pecahan.
NumPy random: Membuat Data Acak untuk Simulasi
NumPy random bikin angka acak buat simulasi dan data dummy. Ini cara pakai default_rng, atur seed, dan generate sampel yang bisa diulang.
NumPy where: Operasi Bersyarat pada Array
np.where milih nilai berdasarkan kondisi ke seluruh array sekaligus, tanpa loop. Ini cara pakainya buat kolom bersyarat dan cari posisi elemen.