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.
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 reshape: Ubah Bentuk Array (2026)
Fungsi reshape di NumPy ngatur ulang bentuk array tanpa ngubah datanya. Ini cara pakainya, arti angka -1, dan cara ngeflat array.
NumPy Array: Dasar-Dasar untuk Analis Data (2026)
NumPy array bikin hitungan data di Python jauh lebih cepat dari list biasa. Ini dasar bikin, slicing, dan operasi array buat analis.
Alternatif iterrows yang Lebih Cepat di Pandas
iterrows nyaman ditulis tapi lambat. Ini urutan alternatif iterrows di pandas dari yang tercepat, plus benchmark biar kamu tau kapan pakai yang mana.