Chapter sebelumnya berakhir pada masalah yang nyata: hasil agg() dengan list fungsi berupa kolom bertingkat dengan pasangan seperti ("total", "sum"), dan fungsi tanpa nama muncul sebagai <lambda_0>. Named aggregation menyelesaikan masalah penamaan itu di tempat yang sama: setiap kolom hasil langsung diberi nama saat agg() ditulis. Fitur ini memakai argumen kata kunci (keyword argument) yang berisi tuple (nama_kolom_sumber, fungsi). Pada Chapter ini kita menyusun laporan penjualan per kota dengan kolom hasil yang bersih, lalu menerapkan pola yang sama pada fungsi buatan sendiri.
Melihat Kembali Masalah Penamaan #
Script berikut dimulai dari kondisi akhir chapter sebelumnya: agg() dua kolom dengan list fungsi menghasilkan kolom bertingkat. Program mencetak struktur h.columns agar kita melihat bentuknya, lalu menunjukkan versi named aggregation dari tabel yang sama.
import pandas as pd
transaksi = pd.DataFrame({
"kota": ["Jakarta", "Jakarta", "Jakarta", "Jakarta",
"Bandung", "Bandung", "Bandung", "Bandung",
"Surabaya", "Surabaya", "Surabaya", "Surabaya"],
"kategori": ["Minuman", "Minuman", "Makanan", "Sembako",
"Minuman", "Makanan", "Sembako", "Makanan",
"Minuman", "Sembako", "Makanan", "Minuman"],
"produk": ["Kopi Gayo", "Teh Melati", "Roti Tawar", "Beras Premium",
"Kopi Gayo", "Roti Tawar", "Beras Premium", "Mie Instan",
"Teh Melati", "Beras Premium", "Mie Instan", "Kopi Gayo"],
"jumlah": [3, 2, 4, 1, 5, 2, 3, 10, 6, 2, 8, 1],
"harga": [18000, 12000, 15000, 68000, 18000, 15000, 68000, 3500,
12000, 68000, 3500, 18000],
"total": [54000, 24000, 60000, 68000, 90000, 30000, 204000, 35000,
72000, 136000, 28000, 18000],
})
print("masalah: nama kolom hasil dari agg() dengan list:")
h = transaksi.groupby("kota")[["total", "jumlah"]].agg(["sum", "mean"])
print(list(h.columns))
print()
print("named aggregation:")
laporan = transaksi.groupby("kota").agg(
omzet=("total", "sum"),
banyak_transaksi=("produk", "count"),
rata_nilai=("total", "mean"),
)
print(laporan)
print()
print("nama kolom hasil:", list(laporan.columns))
print()
print("named aggregation dengan fungsi sendiri:")
ringkas = transaksi.groupby("kategori").agg(
omzet=("total", "sum"),
rentang=("total", lambda s: s.max() - s.min()),
)
print(ringkas)Output yang Dihasilkan:
masalah: nama kolom hasil dari agg() dengan list:
[('total', 'sum'), ('total', 'mean'), ('jumlah', 'sum'), ('jumlah', 'mean')]
named aggregation:
omzet banyak_transaksi rata_nilai
kota
Bandung 359000 4 89750.0
Jakarta 206000 4 51500.0
Surabaya 254000 4 63500.0
nama kolom hasil: ['omzet', 'banyak_transaksi', 'rata_nilai']
named aggregation dengan fungsi sendiri:
omzet rentang
kategori
Makanan 153000 32000
Minuman 258000 72000
Sembako 408000 136000Mari kita bedah baris-baris penting script di atas:
- Baris 21-22:
agg(["sum", "mean"])pada dua kolom menghasilkan MultiIndex kolom;list(h.columns)mencetak pasangan seperti('total', 'sum'). - Baris 26-30: setiap argumen kata kunci, yaitu
omzet,banyak_transaksi, danrata_nilai, dipetakan ke sebuah tuple; elemen pertama tuple adalah kolom sumber dan elemen keduanya adalah fungsi. - Baris 33:
list(laporan.columns)menampilkan nama kolom datar persis sesuai kata kunci yang kita tulis. - Baris 37-40: named aggregation juga menerima fungsi kustom;
rentang=("total", lambda s: s.max() - s.min())menghitung rentang omzet per kategori tanpa menghasilkan kolom<lambda_0>.
Aturan Menulis Named Aggregation #
Tiga aturan kecil menjaga sintaks ini tetap bersih. Nama argumen harus berupa identifier Python yang sah, sehingga tidak boleh mengandung spasi; gunakan rata_nilai, bukan rata nilai. Isi tuple selalu dua bagian dan urutannya tidak boleh dibalik: kolom sumber dulu, fungsi kemudian. Bila ingin penulisan yang lebih eksplisit, tuple boleh diganti pd.NamedAgg("total", "sum") dan hasilnya identik.
Kapan Memilih Named Aggregation #
Tabel berikut membandingkan kedua gaya penulisan agregasi yang sudah kita bahas sepanjang dua chapter.
| Aspek | agg() dengan list | Named aggregation |
|---|---|---|
| Nama kolom hasil | nama fungsi atau <lambda_0> | bebas, kita yang menamai |
| Struktur kolom | datar (satu kolom sumber) atau bertingkat (banyak kolom) | selalu datar |
| Fungsi kustom | berlabel otomatis | langsung bernama bermakna |
Untuk laporan yang akan dibaca orang lain, named aggregation hampir selalu pilihan terbaik karena nama kolom hasilnya sekaligus berfungsi sebagai dokumentasi. Untuk eksplorasi cepat, agg(["sum", "mean"]) tetap lebih pendek dan tidak ada larangan memakainya. Kedua gaya bisa hidup berdampingan dalam satu proyek, asalkan penamaan kolom konsisten antar script. Panduan resminya ada pada user guide groupby
, pandas.NamedAgg
, dan pandas.DataFrame.agg
.
Sampai titik ini, seluruh kelompok data kita selalu diringkas menjadi satu baris per kelompok. Kebutuhan berikutnya yang sering muncul justru sebaliknya: menempelkan hasil kelompok kembali ke baris asli, misalnya menulis rata-rata omzet kota di sebelah setiap transaksi tanpa mengubah jumlah baris. Pekerjaan itu menjadi tugas transform(), dan itulah topik chapter berikutnya.