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.

python
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:

text
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   136000

Mari kita bedah baris-baris penting script di atas:

  1. Baris 21-22: agg(["sum", "mean"]) pada dua kolom menghasilkan MultiIndex kolom; list(h.columns) mencetak pasangan seperti ('total', 'sum').
  2. Baris 26-30: setiap argumen kata kunci, yaitu omzet, banyak_transaksi, dan rata_nilai, dipetakan ke sebuah tuple; elemen pertama tuple adalah kolom sumber dan elemen keduanya adalah fungsi.
  3. Baris 33: list(laporan.columns) menampilkan nama kolom datar persis sesuai kata kunci yang kita tulis.
  4. 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.

Aspekagg() dengan listNamed aggregation
Nama kolom hasilnama fungsi atau <lambda_0>bebas, kita yang menamai
Struktur kolomdatar (satu kolom sumber) atau bertingkat (banyak kolom)selalu datar
Fungsi kustomberlabel otomatislangsung 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.