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.

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],
})

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:

text
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.25

Mari kita bedah baris-baris penting script di atas:

  1. Baris 23: g.agg(["sum", "mean", "count"]) menerapkan tiga fungsi sekaligus; hasilnya DataFrame dengan kolom bernama sum, mean, dan count serta index berupa kunci kelompok.
  2. Baris 26: list(ringkasan.columns) menampilkan nama kolom hasil; ketika sumbernya satu kolom saja, nama fungsi langsung menjadi nama kolom tanpa bertingkat.
  3. Baris 30: bentuk dictionary {"total": "sum", "jumlah": "mean"} mengizinkan fungsi berbeda untuk kolom berbeda dalam satu panggilan.
  4. Baris 34: agg() juga menerima fungsi buatan sendiri; lambda menerima satu Series berisi nilai satu kelompok dan mengembalikan selisih max() - min(), yaitu rentang nilai transaksi.
  5. 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 argumenContoh penulisanHasil
list nama fungsig.agg(["sum", "mean"])satu kolom per fungsi
dict kolom-fungsi.agg({"total": "sum", "jumlah": "mean"})fungsi berbeda per kolom
callableg.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.