Panggilan g.sum() pada chapter sebelumnya menghasilkan satu jenis ringkasan per satu method. Laporan riil hampir selalu menuntut beberapa statistik berdampingan dalam satu tabel: omzet, rata-rata nilai transaksi, dan banyaknya transaksi sekaligus. Method agg() (singkatan dari aggregate()) dibuat untuk kebutuhan itu: satu pengelompokan, banyak fungsi agregasi dalam satu panggilan. Chapter ini membahas tiga bentuk argumen agg(), yaitu daftar nama fungsi, dictionary kolom-fungsi, dan fungsi buatan sendiri, lalu menutup dengan struktur kolom yang dihasilkan ketika dua kolom diproses bersamaan.
Daftar Fungsi dalam Bentuk List #
Script berikut menerapkan agg() pada objek SeriesGroupBy kolom total dengan list ["sum", "mean", "count"], lalu mencoba dua bentuk argumen lainnya.
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],
})
g = transaksi.groupby("kota")["total"]
print("agg() dengan list fungsi:")
ringkasan = g.agg(["sum", "mean", "count"])
print(ringkasan)
print()
print("nama kolom hasil:", list(ringkasan.columns))
print()
print("agg() dengan dict kolom -> fungsi:")
print(transaksi.groupby("kota").agg({"total": "sum", "jumlah": "mean"}))
print()
print("agg() dengan fungsi sendiri (rentang):")
print(g.agg(lambda s: s.max() - s.min()))
print()
print("list fungsi pada dua kolom sekaligus:")
print(transaksi.groupby("kota")[["total", "jumlah"]].agg(["sum", "mean"]))Output yang Dihasilkan:
agg() dengan list fungsi:
sum mean count
kota
Bandung 359000 89750.0 4
Jakarta 206000 51500.0 4
Surabaya 254000 63500.0 4
nama kolom hasil: ['sum', 'mean', 'count']
agg() dengan dict kolom -> fungsi:
total jumlah
kota
Bandung 359000 5.00
Jakarta 206000 2.50
Surabaya 254000 4.25
agg() dengan fungsi sendiri (rentang):
kota
Bandung 174000
Jakarta 44000
Surabaya 118000
Name: total, dtype: int64
list fungsi pada dua kolom sekaligus:
total jumlah
sum mean sum mean
kota
Bandung 359000 89750.0 20 5.00
Jakarta 206000 51500.0 10 2.50
Surabaya 254000 63500.0 17 4.25Mari kita bedah baris-baris penting script di atas:
- Baris 23:
g.agg(["sum", "mean", "count"])menerapkan tiga fungsi sekaligus; hasilnya DataFrame dengan kolom bernamasum,mean, dancountserta index berupa kunci kelompok. - Baris 26:
list(ringkasan.columns)menampilkan nama kolom hasil; ketika sumbernya satu kolom saja, nama fungsi langsung menjadi nama kolom tanpa bertingkat. - Baris 30: bentuk dictionary
{"total": "sum", "jumlah": "mean"}mengizinkan fungsi berbeda untuk kolom berbeda dalam satu panggilan. - Baris 34:
agg()juga menerima fungsi buatan sendiri; lambda menerima satu Series berisi nilai satu kelompok dan mengembalikan selisihmax() - min(), yaitu rentang nilai transaksi. - Baris 38: ketika list fungsi diterapkan pada dua kolom sekaligus, pandas menggabungkan setiap pasangan kolom dan fungsi menjadi kolom bertingkat.
Fungsi Buatan Sendiri di Dalam agg() #
Lambda pada baris 34 menunjukkan aturan umum fungsi agregasi kustom: argumennya adalah satu Series berisi seluruh nilai kelompok, dan kembaliannya harus satu nilai skalar. Rentang (max() - min()) hanyalah satu contoh; kita juga bisa menghitung selisih terhadap median, proporsi nilai terbesar terhadap total kelompok, atau indikator lain yang tidak tersedia bawaan. Setiap kelompok diproses dengan fungsi yang sama, sehingga hasilnya tetap tergabung rapi dalam satu Series ber-index kunci kelompok. Bila logikanya mulai panjang, pindahkan lambda ke fungsi bernama agar baris agg() tetap mudah dibaca.
Bentuk Argumen agg() yang Didukung #
Tabel berikut merangkum tiga bentuk argumen yang kita pakai pada script tadi.
| Bentuk argumen | Contoh penulisan | Hasil |
|---|---|---|
| list nama fungsi | g.agg(["sum", "mean"]) | satu kolom per fungsi |
| dict kolom-fungsi | .agg({"total": "sum", "jumlah": "mean"}) | fungsi berbeda per kolom |
| callable | g.agg(lambda s: s.max() - s.min()) | satu Series hasil fungsi sendiri |
Nama fungsi yang ditulis sebagai string harus tersedia sebagai method agregasi bawaan, misalnya "sum" dan "mean". Kita juga boleh mencampur string dan fungsi dalam satu list, seperti ["sum", lambda s: s.max() - s.min()]; pandas menampilkan fungsi tanpa nama dengan label <lambda_0>. Rujukan parameter lengkapnya ada pada dokumentasi pandas.DataFrame.agg
dan user guide groupby
.
Kolom Bertingkat Ketika Dua Kolom Diproses Bersamaan #
Blok terakhir script menampilkan efek samping yang penting diketahui sejak dini. Ketika ["sum", "mean"] diterapkan pada dua kolom, hasilnya bukan lagi kolom datar bernama sum dan mean, melainkan kolom bertingkat (MultiIndex) dengan level atas total dan jumlah serta level bawah nama fungsi. Struktur ini informatif, tetapi mengambil satu angka jadi panjang, misalnya hasil[("total", "sum")]["Bandung"]. Fungsi tanpa nama juga muncul dengan label otomatis seperti <lambda_0> yang tidak menceritakan isinya.
agg() menyelesaikan soal banyak fungsi, tetapi soal penamaan kolom hasil masih tersisa: kolom bertingkat dan label <lambda_0> tidak ramah untuk laporan. Named aggregation menutup celah itu dengan menyatukan penamaan dan agregasi dalam satu penulisan. Chapter berikutnya memperkenalkan sintaksnya dan merapikan laporan penjualan kita sampai ke nama kolomnya.