Agregasi Dasar

groupby dan agg dengan agregasi bernama untuk menghitung statistik per grup.

Daftar isi

Agregasi merangkum banyak baris menjadi satu angka per kelompok, dan alat utamanya adalah groupby yang dipadukan dengan fungsi agregat. Topik ini membahas perhitungan rata-rata pada satu kolom, penerapan beberapa fungsi sekaligus dengan agg, dan agregasi bernama (named aggregation) yang menetapkan nama kolom hasil secara eksplisit. Setelah membaca, ringkasan statistik per ruangan dapat dihitung dengan nama kolom hasil yang terkontrol dan siap dipakai pada langkah berikutnya.

Rata-rata pada satu kolom#

Rata-rata per grup pada satu kolom dihitung dengan df.groupby("ruang")["suhu_c"].mean(), yaitu tahap split lewat groupby, seleksi satu kolom, lalu fungsi agregat mean yang menjalankan tahap apply dan combine sekaligus. Seleksi kolom dilakukan sebelum fungsi agregat agar perhitungannya fokus pada satu deret nilai. Hasilnya berupa Series dengan kunci grup sebagai label barisnya.

python Rata-rata suhu per ruang pada satu kolom
import numpy as np
import pandas as pd

rng = np.random.default_rng(42)
n = 96
df = pd.DataFrame({
    "waktu": pd.date_range("2026-01-05 07:00", periods=n, freq="15min"),
    "ruang": rng.choice(["Lab A", "Lab B", "Ruang Arsip"], n, p=[0.4, 0.35, 0.25]),
    "suhu_c": np.round(rng.normal(24, 1.5, n), 1),
    "lembap_pct": np.round(rng.normal(60, 5, n), 1),
    "status_sensor": rng.choice(["normal", "kalibrasi", "rusak"], n, p=[0.85, 0.10, 0.05]),
})
df.to_csv("sensor_log.csv", index=False)  # dataset bersama untuk seluruh modul
df = pd.read_csv("sensor_log.csv", parse_dates=["waktu"])
print(df.groupby("ruang")["suhu_c"].mean())
text Keluaran
ruang
Lab A          23.730556
Lab B          23.807895
Ruang Arsip    24.259091
Name: suhu_c, dtype: float64

Keluaran menunjukkan tiga baris hasil, satu untuk setiap pecahan. Ruang Arsip mencatat rata-rata tertinggi pada 24.259091 derajat Celsius, sedangkan Lab A dan Lab B berada di kisaran 23.7 sampai 23.8 derajat. Karena hasilnya Series, ketiga angka itu dapat langsung diperbandingkan antar ruangan tanpa pengolahan tambahan. Bentuk satu kolom ini adalah kasus khusus yang paling sering dipakai, dan agg pada bagian berikutnya mengembangkannya menjadi banyak fungsi sekaligus.

Beberapa fungsi sekaligus dengan agg#

Fungsi agg menerima daftar nama fungsi dan menerapkan seluruhnya pada kolom yang sama dalam satu panggilan. Bentuk df.groupby("ruang")["suhu_c"].agg(["min", "mean", "max"]) menghasilkan DataFrame dengan tiga kolom hasil, dan setiap kolomnya dinamai mengikuti nama fungsinya. Pendekatan ini menggantikan tiga panggilan terpisah sehingga data hanya dijelajahi sekali saja.

python Daftar fungsi agregasi pada satu kolom
import pandas as pd

df = pd.read_csv("sensor_log.csv", parse_dates=["waktu"])
print(df.groupby("ruang")["suhu_c"].agg(["min", "mean", "max"]))
text Keluaran
              min       mean   max
ruang
Lab A        21.4  23.730556  27.2
Lab B        20.8  23.807895  26.7
Ruang Arsip  21.5  24.259091  28.4

Tabel hasil memuat nilai minimum, rata-rata, dan maksimum suhu untuk setiap ruang. Nilai maksimum Ruang Arsip mencapai 28.4 derajat dan minimum Lab B turun hingga 20.8 derajat, sehingga sebaran suhu antar ruang dapat dibandingkan tanpa mengulang perhitungan. Nama kolom hasil otomatis mengikuti nama fungsinya, yaitu min, mean, dan max, dan nama inilah yang dipakai ketika hasilnya dipilih kembali.

Agregasi bernama untuk penamaan kolom hasil#

Agregasi bernama menetapkan nama kolom hasil secara eksplisit dengan sintaks nama_hasil=("kolom_asal", "fungsi") di dalam agg. Bentuk ini dipanggil pada objek groupby DataFrame, sehingga beberapa pasangan kolom dan fungsi dapat dirangkai dalam satu panggilan. Nama hasil yang ditetapkan tidak bergantung pada nama fungsi, sehingga tabel ringkasan langsung siap dipakai pada laporan atau rantai metode berikutnya.

python Agregasi bernama dengan penamaan kolom hasil
import pandas as pd

df = pd.read_csv("sensor_log.csv", parse_dates=["waktu"])
ringkas = df.groupby("ruang").agg(
    suhu_rata=("suhu_c", "mean"),
    suhu_maks=("suhu_c", "max"),
    kelembapan_rata=("lembap_pct", "mean"),
)
print(ringkas)
text Keluaran
             suhu_rata  suhu_maks  kelembapan_rata
ruang
Lab A        23.730556       27.2        60.605556
Lab B        23.807895       26.7        59.557895
Ruang Arsip  24.259091       28.4        59.177273

Kolom hasil kini bernama suhu_rata, suhu_maks, dan kelembapan_rata sesuai yang ditetapkan, bukan mean dan max yang hanya bermakna dalam konteks fungsi. Penamaan semacam ini menghilangkan kebutuhan mengganti nama kolom setelahnya dan membuat kode pemakaiannya terbaca sebagai nama besaran, bukan sebagai nama fungsi. Index hasil tetap berupa kunci grup, yaitu ruang, karena parameter as_index tidak diubah.

Kesalahan umum#

Dua kesalahan paling sering muncul pada agregasi dasar. Kesalahan pertama adalah memanggil mean() langsung pada groupby DataFrame yang memuat kolom teks. Pada pandas 3.x, kolom teks bertipe str tidak mendukung operasi rata-rata, sehingga panggilan tanpa parameter numeric_only menimbulkan TypeError dan bukan sekadar mengabaikan kolom teks. Kesalahan kedua adalah berharap kolom kunci tetap menjadi kolom biasa, padahal secara default kunci grup berpindah menjadi index hasil.

python Perilaku numeric_only dan as_index pada pandas 3.x
import numpy as np
import pandas as pd

rng = np.random.default_rng(42)
n = 96
df = pd.DataFrame({
    "waktu": pd.date_range("2026-01-05 07:00", periods=n, freq="15min"),
    "ruang": rng.choice(["Lab A", "Lab B", "Ruang Arsip"], n, p=[0.4, 0.35, 0.25]),
    "suhu_c": np.round(rng.normal(24, 1.5, n), 1),
    "lembap_pct": np.round(rng.normal(60, 5, n), 1),
    "status_sensor": rng.choice(["normal", "kalibrasi", "rusak"], n, p=[0.85, 0.10, 0.05]),
})
try:
    df.groupby("ruang").mean()
except TypeError as e:
    print(type(e).__name__, ":", e)
print(df.groupby("ruang").mean(numeric_only=True))
print(df.groupby("ruang", as_index=False)["suhu_c"].mean())
text Keluaran
TypeError : dtype 'str' does not support operation 'mean'
                suhu_c  lembap_pct
ruang
Lab A        23.730556   60.605556
Lab B        23.807895   59.557895
Ruang Arsip  24.259091   59.177273
         ruang     suhu_c
0        Lab A  23.730556
1        Lab B  23.807895
2  Ruang Arsip  24.259091

Pesan TypeError: dtype 'str' does not support operation 'mean' menegaskan bahwa pandas 3.x menolak menghitung rata-rata kolom teks, dan perbaikannya adalah mean(numeric_only=True) yang menyertakan hanya kolom numerik. Bagian terakhir keluaran memperlihatkan as_index=False, yaitu kunci grup tetap tampil sebagai kolom ruang dengan index angka 0 sampai 2. Gunakan bentuk index bila hasil akan digabungkan atau dirujuk lewat label, dan gunakan as_index=False bila hasil akan ditulis menjadi berkas atau tabel laporan.

Ringkasan#

  • df.groupby("ruang")["suhu_c"].mean() menghasilkan Series statistik per grup dengan kunci grup sebagai label barisnya.
  • agg(["min", "mean", "max"]) menerapkan banyak fungsi sekaligus dan menamai kolom hasil mengikuti nama fungsinya.
  • Agregasi bernama seperti suhu_rata=("suhu_c", "mean") menetapkan nama kolom hasil secara eksplisit sehingga tabel ringkasan siap dipakai tanpa penggantian nama.
  • Pada pandas 3.x, agregasi pada DataFrame dengan kolom teks membutuhkan numeric_only=True, dan as_index=False mempertahankan kunci grup sebagai kolom biasa.

Referensi#