Menggunakan Pandas GroupBy dan Aggregation untuk Analisis Data Tabular yang Efisien
Ketika bekerja dengan dataset tabular, kita sering perlu melakukan agregasi data berdasarkan kelompok tertentu. Bayangkan kita memiliki data penjualan dari berbagai cabang toko dan perlu menghitung total penjualan per kota atau rata-rata pendapatan per kategori produk. Proses ini bisa dilakukan dengan loop dan conditional statements, tetapi pendekatan tersebut tidak efisien dan cenderung menghasilkan kode yang sulit dibaca.
Pandas menyediakan mekanisme groupby yang powerful untuk melakukan operasi ini dengan syntax yang bersih dan performa yang optimal. Mari kita pelajari cara menggunakan fitur ini secara efektif.
Memahami Konsep GroupBy dalam Pandas
Fungsi groupby() pada Pandas mengimplementasikan konsep split-apply-combine. Proses ini terdiri dari tiga langkah:
1. Split: Memecah DataFrame menjadi groups berdasarkan satu atau lebih kolom 2. Apply: Menerapkan fungsi aggregation atau transformasi pada setiap group 3. Combine: Menggabungkan hasil kembali menjadi DataFrame baru

Gambar: Visualisasi library Pandas yang digunakan dalam proses groupby dan aggregation — Sumber: [Pandas Official](https://pandas.org/)
Pendekatan manual dengan loop memang memungkinkan, tetapi memiliki beberapa kelemahan signifikan. Kode menjadi lebih panjang, performa menurun karena iterasi Python native jauh lebih lambat dibandingkan operasi vektorisasi Pandas, dan logic menjadi tersebar sehingga sulit di-maintain.
Berikut perbandingan sederhana antara pendekatan manual dan penggunaan groupby():
import pandas as pd
import numpy as np
df = pd.DataFrame({
'kota': ['Jakarta', 'Surabaya', 'Jakarta', 'Bandung', 'Surabaya', 'Bandung'],
'produk': ['A', 'A', 'B', 'A', 'B', 'B'],
'penjualan': [100, 200, 150, 300, 250, 180]
})
# Pendekatan manual dengan loop
def manual_group_sum(df, group_col, agg_col):
hasil = {}
for idx, row in df.iterrows():
key = row[group_col]
if key not in hasil:
hasil[key] = 0
hasil[key] += row[agg_col]
return pd.DataFrame(list(hasil.items()), columns=[group_col, agg_col])
# Pendekatan dengan groupby
hasil = df.groupby('kota')['penjualan'].sum().reset_index()
print("Hasil groupby:")
print(hasil)Output:
Hasil groupby:
kota penjualan
0 Bandung 480
1 Jakarta 250
2 Surabaya 450Output dari kode di atas menunjukkan bahwa groupby() menghasilkan DataFrame dengan struktur yang rapi dan proses yang jauh lebih cepat terutama untuk dataset berskala besar.
Fungsi Aggregation Bawaan dan Custom Aggregation
Pandas menyediakan berbagai fungsi aggregation bawaan yang dapat langsung digunakan setelah groupby(). Fungsi-fungsi ini mencakup sum() untuk penjumlahan, mean() untuk rata-rata, count() untuk menghitung jumlah record, min() dan max() untuk nilai ekstrem, serta std() dan var() untuk statistik dispersi.
Kekuatan sesungguhnya dari Pandas terletak pada kemampuan agg() yang memungkinkan kita menerapkan multiple aggregations secara bersamaan. Dengan agg(), kita bisa mendapatkan berbagai statistik dalam satu operasi tanpa perlu memanggil groupby() berulang kali.
# Multiple aggregation pada kolom yang sama
statistik = df.groupby('kota')['penjualan'].agg(['sum', 'mean', 'count', 'std']).reset_index()
print(statistik)
# Multiple aggregation dengan nama kolom berbeda
hasil = df.groupby('kota').agg({
'penjualan': ['sum', 'mean'],
'produk': 'count'
}).reset_index()
print(hasil)Output:
kota sum mean count std
0 Bandung 480 240.0 2 84.852814
1 Jakarta 250 125.0 2 35.355339
2 Surabaya 450 225.0 2 35.355339
kota penjualan produk
sum mean count
0 Bandung 480 240.0 2
1 Jakarta 250 125.0 2
2 Surabaya 450 225.0 2Untuk kasus di mana kita memerlukan kalkulasi yang tidak tersedia secara bawaan, Pandas mengizinkan pembuatan custom aggregation function. Fungsi ini menerima array nilai dan mengembalikan satu nilai skalar:
Data Science with Python
Master the art of data analysis, visualization, and predictive modeling.
def range_calculator(x):
return x.max() - x.min()
def coefficient_of_variation(x):
return (x.std() / x.mean()) * 100
custom_agg = df.groupby('kota')['penjualan'].agg([
('total', 'sum'),
('rata_rata', 'mean'),
('jumlah_transaksi', 'count'),
('range', range_calculator),
('cv_percent', coefficient_of_variation)
]).reset_index()
print(custom_agg)Output:
kota total rata_rata jumlah_transaksi range cv_percent
0 Bandung 480 240.0 2 120 35.355339
1 Jakarta 250 125.0 2 50 28.284271
2 Surabaya 450 225.0 2 50 15.713484Kemampuan untuk mendefinisikan fungsi aggregation sendiri memberikan fleksibilitas penuh dalam melakukan analisis data sesuai kebutuhan spesifik proyek.
Transformasi Data dengan GroupBy dan Apply
Sering kali kita perlu melakukan operasi yang bukan sekadar aggregation, melainkan transformasi data dalam konteks grup. Misalnya, menormalisasi nilai dalam setiap grup relative terhadap rata-rata grup tersebut. Di sinilah fungsi transform() dan apply() menjadi sangat berguna.
Perbedaan mendasar antara aggregation, transformation, dan filtration perlu dipahami. Aggregation mengurangi jumlah baris dengan menghitung satu nilai per grup. Transformation mempertahankan jumlah baris original tetapi mengubah nilai berdasarkan informasi grup. Filtration menyaring baris berdasarkan kondisi yang melibatkan seluruh grup.
Method transform() sangat powerful untuk operasi seperti normalisasi dalam grup. Berikut contoh penerapannya:
# Normalisasi penjualan dalam setiap grup kota
df['penjualan_normalized'] = df.groupby('kota')['penjualan'].transform(
lambda x: (x - x.mean()) / x.std()
)
# Menambahkan kolom dengan rata-rata grup
df['rata_rata_kota'] = df.groupby('kota')['penjualan'].transform('mean')
# Kalkulasi rank dalam grup
df['rank_dalam_kota'] = df.groupby('kota')['penjualan'].transform(
lambda x: x.rank(ascending=False)
)
print(df)Output:
kota produk penjualan penjualan_normalized rata_rata_kota rank_dalam_kota
0 Jakarta A 100 -0.707107 125.0 2.0
1 Surabaya A 200 -0.707107 225.0 2.0
2 Jakarta B 150 0.707107 125.0 1.0
3 Bandung A 300 0.707107 240.0 1.0
4 Surabaya B 250 0.707107 225.0 1.0
5 Bandung B 180 -0.707107 240.0 2.0Method apply() memberikan fleksibilitas yang lebih besar karena dapat mengembalikan DataFrame, Series, atau nilai skalar tunggal. Gunakan apply() ketika kita memerlukan logika yang kompleks dan tidak bisa diselesaikan dengan fungsi bawaan:
def normalize_by_group_mean(x):
return x / x.mean()
def calculate_z_score(x):
return (x - x.mean()) / x.std()
df['relative_to_mean'] = df.groupby('kota')['penjualan'].transform(normalize_by_group_mean)
df['z_score'] = df.groupby('kota')['penjualan'].transform(calculate_z_score)
print(df[['kota', 'produk', 'penjualan', 'relative_to_mean', 'z_score']])Output:
kota produk penjualan relative_to_mean z_score
0 Jakarta A 100 0.800000 -0.707107
1 Surabaya A 200 0.888889 -0.707107
2 Jakarta B 150 1.200000 0.707107
3 Bandung A 300 1.250000 0.707107
4 Surabaya B 250 1.111111 0.707107
5 Bandung B 180 0.750000 -0.707107Multi-Index dan Hierarchical Grouping
Pandas memungkinkan grouping berdasarkan multiple columns yang menghasilkan multi-level index. Struktur ini bermanfaat ketika kita memerlukan analisis hierarkis, misalnya melihat penjualan berdasarkan kota dan produk secara bersamaan.
Operasi unstack() dan stack() memungkinkan kita untuk mengubah struktur DataFrame dengan pivot antara index dan columns. Kemampuan ini sangat berguna ketika kita perlu menampilkan data dalam format yang berbeda untuk berbagai keperluan reporting:
# Groupby dengan multiple columns
hasil = df.groupby(['kota', 'produk'])['penjualan'].sum().reset_index()
print(hasil)
# Melihat hasil dalam format pivot table
pivot = df.pivot_table(
values='penjualan',
index='kota',
columns='produk',
aggfunc='sum',
fill_value=0
)
print(pivot)
# Reset index untuk mendapatkan format flat
pivot_reset = pivot.reset_index()
print(pivot_reset)
# Menggunakan level pada multi-index
grouped = df.groupby(['kota', 'produk'])['penjualan'].sum()
print(grouped.index)
print(grouped['Jakarta']) # Mengakses data untuk kota Jakarta sajaOutput:
kota produk penjualan
0 Bandung A 300
1 Bandung B 180
2 Jakarta A 100
3 Jakarta B 150
4 Surabaya A 200
5 Surabaya B 250
produk A B
kota
Bandung 300 180
Jakarta 100 150
Surabaya 200 250
produk kota A B
0 Bandung 300 180
1 Jakarta 100 150
2 Surabaya 200 250
MultiIndex([( 'Bandung', 'A'),
( 'Bandung', 'B'),
( 'Jakarta', 'A'),
( 'Jakarta', 'B'),
('Surabaya', 'A'),
('Surabaya', 'B')],
names=['kota', 'produk'])
produk
A 100
B 150
Name: penjualan, dtype: int64Kemampuan untuk mengakses data pada level tertentu dari multi-index memberikan fleksibilitas tinggi dalam eksplorasi dan analisis data hierarkis.
Praktik Terbaik dan Common Pitfalls
Ketika bekerja dengan groupby() pada dataset besar, beberapa praktik terbaik perlu diperhatikan untuk memastikan performa dan reliability kode.
Performance optimization sangat penting untuk dataset dengan jutaan baris. Gunakan categorical dtype untuk kolom yang sering digunakan sebagai grouping key karena Pandas dapat mengoptimalkan operasi groupby pada categorical data jauh lebih efisien dibandingkan string biasa. Sebagai contoh, konversi kolom kategori sebelum melakukan groupby:
# Konversi ke categorical untuk optimasi
df['kota'] = df['kota'].astype('category')
df['produk'] = df['produk'].astype('category')
# Sekarang groupby akan lebih cepat
hasil = df.groupby(['kota', 'produk'])['penjualan'].sum()
print(hasil)Output:
kota produk
Bandung A 300
B 180
Jakarta A 100
B 150
Surabaya A 200
B 250
Name: penjualan, dtype: int64Debugging strategy yang efektif mencakup penggunaan groups attribute untuk melihat struktur grup, get_group() untuk memeriksa data dalam grup tertentu, dan size() untuk melihat jumlah elemen per grup sebelum melakukan operasi lebih kompleks.
Ingin memperdalam kemampuan data analysis dengan Python? Rumah Coding menyediakan bootcamp Data Science yang mencakup Pandas, Visualisasi Data, dan Machine Learning fundamentals. Kunjungi website kami untuk informasi lebih lanjut tentang program yang tersedia.
Course Terkait
Data Science with Python
Master the art of data analysis, visualization, and predictive modeling.
E-commerce Sales Dashboard
- Data Cleaning Pipeline
- Interactive Charts
- Sales Forecasting Model
Deep Learning Bootcamp
A beginner-friendly, highly interactive bootcamp designed to take you from foundational concepts to deploying real-world Artificial Intelligence applications. Through a completely project-based approach, you will master the core of Deep Learning, Artificial Neural Networks, and Computer Vision using Python and TensorFlow, ultimately building a professional-grade AI web application for your portfolio.
GreenGuard: Intelligent Plant Disease Diagnosis Web App
- Interactive Image Upload UI: A clean, user-friendly interface built with Streamlit that supports drag-and-drop image uploads directly from a computer or mobile phone.
- Real-Time AI Inference: Utilizes a lightweight, optimized CNN model (like MobileNetV2) to process the image and return a diagnosis in seconds without heavy server load.
- Confidence Scoring Dashboard: Visually displays the model's prediction probability (e.g., "95% confident this is Tomato Late Blight") using interactive progress bars or charts.
LLM Bootcamp
This project-based bootcamp is designed for beginners to dive practically into the world of Large Language Models (LLMs). Through hands-on building, you will learn how to interact with top-tier AI APIs, master prompt engineering, orchestrate complex workflows using LangChain, and implement Retrieval-Augmented Generation (RAG) to query your own documents. By the end of this course, you will have the skills to build, test, and deploy a fully functional, custom AI web application.
Domain-Specific AI Knowledge Assistant
- Dynamic Document Processing: A sidebar interface allowing users to upload new PDF or TXT files, which the app automatically chunks, embeds, and stores in the vector database.
- Context-Aware Chat UI: A modern chat interface built with Streamlit that maintains conversation history, allowing users to ask follow-up questions naturally.
- Strict Guardrails (Anti-Hallucination): System instructions designed so the AI politely declines to answer questions that fall outside the context of the uploaded documents.