Pandas transform: Hitung per Grup Tanpa Kehilangan Baris
TL;DR
Method transform di pandas ngitung nilai per grup, tapi balikin hasilnya ke tiap baris asli, jadi jumlah barisnya tetap sama kayak DataFrame awal. Ini beda sama agg yang ngeciutin tiap grup jadi satu baris. transform cocok buat bikin kolom baru kayak persen dari total grup, atau ngisi nilai kosong pakai rata-rata grupnya.
Method transform di pandas ngitung nilai per grup, tapi balikin hasilnya ke tiap baris asli, jadi jumlah barisnya tetap sama kayak DataFrame awal.
Ini beda penting sama agg. agg ngeciutin tiap grup jadi satu baris ringkasan. transform nyebar hasil grup balik ke semua anggotanya. Jadi kamu bisa bikin kolom baru kayak persen tiap transaksi terhadap total kotanya, tanpa kehilangan satu baris pun.
Di artikel ini kamu bakal belajar cara kerjanya, beda sama agg, dan contoh nyata dari data penjualan UMKM.
Apa itu transform di pandas groupby?
transform ngejalanin fungsi agregasi per grup, lalu nyebarin hasilnya balik ke tiap baris di grup itu. Kalau satu kota punya total belanja 10 juta, tiap baris transaksi dari kota itu bakal dapat nilai 10 juta di kolom hasil transform. Jumlah baris output selalu sama persis dengan input.
Proses nyebarin nilai grup ke tiap baris ini mirip konsep broadcasting. Kalau kamu udah paham groupby agg yang ngeringkas data, transform itu kebalikannya: hitung per grup tapi pertahankan bentuk aslinya.
Gimana cara pakai transform?
Pola dasarnya: groupby dulu, pilih kolom, lalu panggil transform dengan nama fungsi. Hasilnya bisa langsung kamu taruh jadi kolom baru.
import pandas as pd
# total belanja per kota, disebar ke tiap baris
df['total_kota'] = df.groupby('kota')['nominal'].transform('sum')
# rata-rata belanja per kota di tiap baris
df['rata_kota'] = df.groupby('kota')['nominal'].transform('mean')
Setelah ini, DataFrame kamu tetap punya semua baris, cuma nambah dua kolom. Tiap baris sekarang tau total dan rata-rata kotanya sendiri, siap dipakai buat perhitungan lanjutan.
Gimana cara bikin kolom persen dari total grup?
Ini contoh paling berguna. Kamu mau tau kontribusi tiap transaksi terhadap total kotanya. Bagi nilai baris dengan total grup hasil transform.
df['pct_dari_kota'] = (
df['nominal'] / df.groupby('kota')['nominal'].transform('sum') * 100
)
Karena transform balikin total kota di tiap baris, pembagiannya langsung sejajar baris per baris. Tanpa transform, kamu harus groupby, hitung total, lalu merge balik ke DataFrame asli. transform motong tiga langkah itu jadi satu.
Gimana cara isi nilai kosong pakai rata-rata grup?
transform juga rapi buat ngisi data kosong berdasarkan grupnya, bukan rata-rata global. Misalnya nominal yang hilang diisi rata-rata kota masing-masing.
df['nominal'] = df['nominal'].fillna(
df.groupby('kota')['nominal'].transform('mean')
)
Cara ini lebih akurat daripada ngisi semua kekosongan pakai satu angka rata-rata global. Tiap baris kosong dapat estimasi yang ngikutin pola kotanya sendiri.
transform vs agg: bedanya di mana?
| Aspek | transform | agg |
|---|---|---|
| Jumlah baris output | Sama dengan input | Satu baris per grup |
| Tujuan | Nambah kolom ke data asli | Bikin tabel ringkasan |
| Contoh hasil | Persen dari total grup | Total dan rata-rata per kota |
| Cocok buat | Perhitungan level baris | Laporan agregat |
Aturan praktisnya: kalau kamu mau nambah kolom ke data mentah, pakai transform. Kalau kamu mau tabel ringkasan yang lebih kecil, pakai agg.
Contoh kasus: kontribusi cabang toko_berkah
Aku pakai dataset toko_berkah, 2.800 transaksi dari 4 cabang. Aku mau tiap transaksi tau berapa persen kontribusinya ke omzet cabangnya, sambil semua baris tetap utuh buat analisa lanjutan.
df['pct_cabang'] = (
df['nominal'] / df.groupby('cabang')['nominal'].transform('sum') * 100
)
top = df.sort_values('pct_cabang', ascending=False).head(10)
Hasilnya kelihatan menarik. Di cabang Surabaya, ada satu transaksi grosir senilai Rp 2,1 juta yang sendirian nyumbang 4,4% dari total omzet cabang itu. Bandingkan dengan cabang Bandung, di mana transaksi terbesarnya cuma nyumbang 0,8%.
Angka ini nunjukin Surabaya bergantung pada beberapa pembeli besar, sedangkan Bandung sebarannya rata dari banyak pembeli kecil. Insight kayak gini cuma keluar kalau tiap baris tau posisinya di dalam grup, dan itu justru yang transform kasih.
Kesalahan umum pakai transform
- Ngira transform bisa ganti agg. Kalau kamu mau ringkasan, pakai agg. transform selalu balikin jumlah baris yang sama.
- Fungsi ngembaliin ukuran salah. Fungsi di transform harus balikin nilai per baris atau satu nilai yang bisa disebar, bukan hasil dengan panjang beda.
- Lupa pilih kolom. Kalau nggak milih kolom sebelum transform, pandas nyoba jalanin ke semua kolom dan bisa error.
- Pakai merge padahal cukup transform. Banyak orang groupby lalu merge balik, padahal transform ngerjain itu dalam satu baris kode.
FAQ
Pertanyaan yang sering muncul soal transform di pandas.
Apa beda transform dan agg di pandas groupby?
agg ngeringkas tiap grup jadi satu baris, jadi output-nya lebih kecil dari input. transform ngitung per grup tapi nyebarin hasilnya balik ke tiap baris asli, jadi jumlah barisnya tetap sama. Pakai agg kalau kamu mau tabel ringkasan, misalnya total per kota. Pakai transform kalau kamu mau nambah kolom baru ke data mentah, misalnya persen tiap transaksi terhadap total kotanya. Keduanya sering dipakai buat kebutuhan yang beda.
Kenapa transform lebih praktis daripada groupby lalu merge?
Kalau kamu groupby buat hitung total grup, hasilnya DataFrame kecil yang harus kamu merge balik ke data asli biar sejajar. Itu dua sampai tiga langkah. transform ngerjain semua itu dalam satu baris kode, karena dia otomatis nyebarin nilai grup ke posisi baris yang bener. Selain lebih ringkas, transform juga lebih kecil kemungkinan salah, karena kamu nggak perlu ngatur kunci merge secara manual.
Fungsi apa aja yang bisa dipakai di transform?
transform nerima fungsi agregasi bawaan kayak sum, mean, count, min, max, dan std, baik ditulis sebagai teks maupun lewat lambda. Syaratnya, fungsi itu harus balikin nilai yang bisa disebar ke tiap baris grup, entah satu nilai per grup atau satu nilai per baris. Fungsi yang ngembaliin hasil dengan panjang beda dari grupnya bakal bikin error. Buat kebanyakan kasus, fungsi agregasi standar udah cukup.
Bisakah transform dipakai buat isi missing value?
Bisa, dan ini salah satu kegunaan terbaiknya. Kamu bisa isi nilai kosong pakai rata-rata grupnya, bukan rata-rata global. Caranya, oper hasil groupby transform mean ke method fillna. Tiap baris kosong bakal keisi rata-rata kelompoknya sendiri, misalnya rata-rata kota masing-masing. Cara ini jauh lebih akurat daripada ngisi semua kekosongan pakai satu angka yang sama, karena ngikutin pola tiap grup.
Penutup
transform bikin kamu ngitung per grup tanpa ngorbanin satu baris pun. Pakai dia buat kolom persen dari total grup, isi nilai kosong per grup, atau normalisasi level baris. Kalau yang kamu mau justru ringkasan yang lebih kecil, itu tugas agg.
Sekali kamu paham bedanya, kamu berhenti bolak-balik groupby lalu merge. Mau lanjut? Baca dasar pandas groupby buat pondasinya. Detail method-nya ada di dokumentasi resmi pandas transform. Mau latihan pandas terarah? 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.