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.
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())ruang
Lab A 23.730556
Lab B 23.807895
Ruang Arsip 24.259091
Name: suhu_c, dtype: float64Keluaran 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.
import pandas as pd
df = pd.read_csv("sensor_log.csv", parse_dates=["waktu"])
print(df.groupby("ruang")["suhu_c"].agg(["min", "mean", "max"])) 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.4Tabel 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.
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) 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.177273Kolom 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.
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())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.259091Pesan 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()menghasilkanSeriesstatistik 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, danas_index=Falsemempertahankan kunci grup sebagai kolom biasa.
Referensi#
- pandas.core.groupby.DataFrameGroupBy.aggregate — pandas API reference — dokumentasi resmi agg beserta bentuk daftar, dict, dan agregasi bernama.
- Group by: split-apply-combine — pandas User Guide — bab resmi pengelompokan yang menjelaskan perilaku agregasi per grup.