Bab 23: Pandas untuk Manipulasi Data
- Fungsi utama Pandas dan struktur data: Series (1D) vs DataFrame (2D).
- Prosedur I/O: Membaca file CSV (`pd.read_csv()`) dan seleksi/filtering data.
- Pembersihan data missing value via `.dropna()` dan `.fillna()`.
- Operasi tingkat lanjut: Agregasi kelompok `.groupby()` dan penggabungan DataFrame `.merge()`.
Apa Itu Pandas dan Kenapa Penting
Pandas adalah library Python yang dirancang khusus untuk mengolah data berbentuk tabel (tabular), dan menjadi salah satu tools paling fundamental dalam ekosistem analisis data menggunakan Python. Nama Pandas sendiri berasal dari "Panel Data", sebuah istilah dalam bidang ekonometrika yang merujuk pada data terstruktur multi-dimensi.
Kabar baiknya, jika kamu sudah cukup nyaman dengan konsep Spreadsheet dan SQL yang sudah dipelajari sepanjang Handbook ini, mempelajari Pandas akan terasa jauh lebih mudah, karena banyak konsep yang sudah kamu kuasai sebelumnya, seperti filtering, sorting, aggregation, dan JOIN, memiliki padanan langsung dalam Pandas, hanya dengan sintaks kode yang berbeda. Kamu bisa membayangkan Pandas sebagai cara melakukan hal-hal yang sudah kamu kuasai di Spreadsheet dan SQL, namun dengan fleksibilitas dan kemampuan otomasi yang jauh lebih besar karena ditulis dalam bentuk kode Python.
Sebelum bisa memakai Pandas, kamu perlu mengimpornya terlebih dahulu di awal kode Python, biasanya dengan konvensi penulisan import pandas as pd, yang berarti kamu bisa memanggil seluruh fungsi Pandas menggunakan singkatan pd, sebuah konvensi yang hampir selalu dipakai secara konsisten oleh siapa pun yang menulis kode Pandas, sehingga penting untuk dibiasakan sejak awal.
Series dan DataFrame: Dua Struktur Data Utama
Pandas memiliki dua struktur data utama yang perlu dipahami perbedaannya. Series adalah struktur data satu dimensi, mirip dengan satu kolom tunggal pada Spreadsheet, berisi kumpulan nilai yang masing-masing memiliki label atau indeks. DataFrame adalah struktur data dua dimensi, mirip dengan keseluruhan tabel pada Spreadsheet, terdiri dari banyak baris dan kolom sekaligus, di mana setiap kolom pada dasarnya adalah sebuah Series.
Kamu bisa membayangkan hubungan antara Series dan DataFrame seperti hubungan antara satu kolom tunggal dengan keseluruhan tabel pada Spreadsheet yang sudah kamu pelajari di Bab 4, di mana DataFrame pada dasarnya adalah kumpulan beberapa Series (kolom) yang digabungkan bersama menjadi satu struktur tabel yang utuh. Sebagian besar pekerjaan analisis data menggunakan Pandas akan lebih banyak melibatkan DataFrame, karena data yang kamu kerjakan pada umumnya memiliki banyak kolom sekaligus, bukan hanya satu kolom tunggal.
| Operasi Pandas | Setara Spreadsheet | Setara SQL |
|---|---|---|
| Filtering df[kondisi] | Filter | WHERE |
| groupby() | Pivot Table | GROUP BY |
| merge() | VLOOKUP/XLOOKUP | JOIN |
Membaca Data dari CSV
Langkah paling umum untuk memulai bekerja dengan Pandas adalah membaca data dari sebuah file, paling sering dalam format CSV (Comma-Separated Values), sebuah format file sederhana yang menyimpan data tabular dengan setiap nilai dipisahkan tanda koma. Untuk membaca file CSV ke dalam sebuah DataFrame, kamu menggunakan fungsi pd.read_csv():
import pandas as pd
df = pd.read_csv("data_pesanan_belanjain.csv")
Perhatikan penamaan variabel df sebagai singkatan dari "DataFrame", sebuah konvensi penamaan yang sangat umum dipakai meskipun bukan aturan wajib, kamu bisa memberi nama variabel apa pun sesuai kebutuhan. Setelah data berhasil dibaca ke dalam DataFrame, kamu bisa melihat beberapa baris pertama dari data tersebut menggunakan df.head(), yang secara default menampilkan lima baris pertama, mirip dengan sekilas melihat isi tabel pada Spreadsheet sebelum mulai mengolahnya lebih lanjut, sebuah kebiasaan awal yang baik untuk memastikan data sudah terbaca dengan benar sebelum melangkah ke analisis lebih jauh.
Filtering dan Seleksi Data
Setelah data berhasil dibaca, salah satu operasi paling dasar yang sering dibutuhkan adalah menyaring baris-baris tertentu berdasarkan kondisi tertentu, sebuah kemampuan yang setara dengan WHERE pada SQL yang sudah dipelajari di Bab 10. Sebagai ilustrasi, jika kamu ingin menyaring hanya transaksi dengan nilai di atas 500000 dari DataFrame df, kodenya ditulis sebagai:
transaksi_besar = df[df["nilai_transaksi"] > 500000]
Perhatikan struktur penulisan df[kondisi] ini, di mana bagian dalam tanda kurung siku, df["nilai_transaksi"] > 500000, sebenarnya menghasilkan sebuah Series berisi nilai True atau False untuk setiap baris, menandakan apakah baris tersebut memenuhi kondisi atau tidak, dan ketika Series boolean ini "dimasukkan kembali" ke dalam tanda kurung siku setelah df, Pandas akan menampilkan hanya baris-baris yang bernilai True.
Untuk menggabungkan beberapa kondisi sekaligus, mirip dengan AND dan OR pada SQL yang sudah dipelajari di Bab 10, Pandas menggunakan simbol & untuk AND dan | untuk OR, dengan setiap kondisi perlu dibungkus tanda kurung terpisah. Sebagai ilustrasi, untuk menyaring transaksi dengan nilai di atas 500000 dan berasal dari kota Jakarta, kodenya ditulis sebagai:
hasil_filter = df[(df["nilai_transaksi"] > 500000) & (df["kota"] == "Jakarta")]
Untuk seleksi kolom tertentu saja (mirip dengan menuliskan nama kolom spesifik setelah SELECT pada SQL), kamu bisa menuliskan nama kolom yang diinginkan dalam tanda kurung siku ganda, seperti df[["nama", "nilai_transaksi"]], yang akan menghasilkan DataFrame baru hanya berisi kedua kolom tersebut.
Menangani Missing Value pada Pandas
Sesuai konsep missing value yang sudah dipelajari pada Bab 5 di konteks Spreadsheet, Pandas juga menyediakan fungsi khusus untuk mendeteksi dan menangani data yang kosong. Untuk memeriksa apakah ada nilai kosong dalam sebuah DataFrame, kamu bisa menggunakan df.isnull().sum(), yang akan menampilkan jumlah nilai kosong untuk setiap kolom, memberikan gambaran cepat mengenai seberapa besar masalah missing value pada data yang sedang kamu kerjakan.
Untuk menghapus baris yang memiliki nilai kosong, sesuai dengan salah satu pendekatan penanganan missing value yang sudah dibahas di Bab 5, kamu bisa menggunakan df.dropna(). Untuk mengisi nilai kosong dengan nilai tertentu, sesuai pendekatan imputasi yang juga sudah dibahas di Bab 5, kamu bisa menggunakan df.fillna(nilai_pengganti), misalnya df["metode_pembayaran"].fillna("Tidak Diketahui") untuk mengisi kolom metode pembayaran yang kosong dengan keterangan "Tidak Diketahui", persis seperti ilustrasi yang sudah dibahas pada Bab 5, hanya kali ini dilakukan melalui kode Pandas, bukan fitur bawaan Spreadsheet.
Perlu diperhatikan bahwa keputusan bagaimana menangani missing value ini, apakah dihapus atau diisi dengan nilai tertentu, tetap memerlukan pertimbangan konteks bisnis yang sama seperti yang sudah dibahas mendalam pada Bab 5, terlepas dari tools apa yang dipakai untuk mengeksekusinya, baik Spreadsheet maupun Pandas.
Groupby: Agregasi Data ala Pandas
Groupby pada Pandas adalah kemampuan yang setara dengan GROUP BY pada SQL yang sudah dipelajari di Bab 11, maupun konsep Pivot Table pada Spreadsheet yang sudah dipelajari di Bab 8, yaitu mengelompokkan data berdasarkan nilai unik pada satu atau lebih kolom, kemudian menghitung agregasi tertentu untuk masing-masing kelompok tersebut.
Sebagai ilustrasi, untuk menghitung total nilai transaksi per kategori produk pada data Belanjain, kodenya ditulis sebagai:
total_per_kategori = df.groupby("kategori")["nilai_transaksi"].sum()
Cara membaca kode ini adalah, df.groupby("kategori") mengelompokkan data berdasarkan nilai unik pada kolom kategori, kemudian ["nilai_transaksi"] memilih kolom nilai transaksi yang ingin dihitung, dan .sum() menentukan jenis agregasi yang dipakai, dalam hal ini penjumlahan, setara dengan fungsi SUM yang sudah dipelajari pada SQL maupun Spreadsheet. Fungsi agregasi lain yang tersedia mencakup .mean() untuk rata-rata (setara AVG pada SQL atau AVERAGE pada Spreadsheet), .count() untuk menghitung jumlah baris (setara COUNT pada SQL), dan berbagai fungsi agregasi lainnya.
Untuk mengelompokkan berdasarkan lebih dari satu kolom sekaligus, mirip dengan GROUP BY dengan beberapa kolom pada SQL, kamu bisa menuliskan daftar nama kolom dalam tanda kurung siku, seperti df.groupby(["kategori", "kota"])["nilai_transaksi"].sum(), yang akan menghasilkan total nilai transaksi untuk setiap kombinasi kategori dan kota.
Merge: Menggabungkan DataFrame
Sesuai konsep JOIN pada SQL yang sudah dipelajari secara mendalam pada Bab 12, Pandas juga menyediakan kemampuan serupa untuk menggabungkan dua DataFrame berdasarkan kolom penghubung tertentu, menggunakan fungsi pd.merge(). Sebagai ilustrasi, jika kamu memiliki DataFrame pesanan dan DataFrame pelanggan yang keduanya memiliki kolom id_pelanggan sebagai penghubung, untuk menggabungkan keduanya mirip dengan INNER JOIN yang sudah dipelajari sebelumnya, kodenya ditulis sebagai:
data_gabungan = pd.merge(pesanan, pelanggan, on="id_pelanggan", how="inner")
Parameter on menentukan kolom penghubung yang dipakai untuk menggabungkan kedua DataFrame tersebut, sementara parameter how menentukan jenis penggabungan yang dipakai, dengan pilihan yang persis sesuai dengan jenis JOIN yang sudah dipelajari pada Bab 12, yaitu "inner" untuk INNER JOIN, "left" untuk LEFT JOIN, "right" untuk RIGHT JOIN, dan "outer" untuk FULL OUTER JOIN. Kesamaan istilah dan konsep ini sengaja dirancang oleh pengembang Pandas agar siapa pun yang sudah familiar dengan SQL bisa dengan mudah bertransisi memakai Pandas, karena logika dasarnya memang benar-benar setara satu sama lain, hanya berbeda dari sisi sintaks penulisannya.
Membangun Alur Kerja Lengkap: Dari CSV Mentah Menjadi Ringkasan
Untuk mengaplikasikan seluruh konsep yang sudah dibahas sepanjang bab ini, mari bayangkan skenario menyeluruh, kamu menerima dua file CSV terpisah dari Belanjain, satu berisi data pesanan dan satu lagi berisi data pelanggan, dan diminta menghasilkan ringkasan total belanja per kota, hanya untuk pelanggan yang memiliki data kota yang valid (tidak kosong).
import pandas as pd
# Membaca kedua file CSV
pesanan = pd.read_csv("pesanan.csv")
pelanggan = pd.read_csv("pelanggan.csv")
# Menangani missing value pada kolom kota
pelanggan = pelanggan.dropna(subset=["kota"])
# Menggabungkan kedua DataFrame
data_gabungan = pd.merge(pesanan, pelanggan, on="id_pelanggan", how="inner")
# Menghitung total belanja per kota
ringkasan_kota = data_gabungan.groupby("kota")["nilai_transaksi"].sum().sort_values(ascending=False)
print(ringkasan_kota)
Perhatikan bagaimana kode ini menggabungkan seluruh konsep yang sudah dipelajari sepanjang bab ini secara berurutan: membaca data dari CSV, menangani missing value dengan dropna() yang dibatasi hanya pada kolom kota menggunakan parameter subset, menggabungkan kedua DataFrame dengan merge(), menghitung agregasi dengan groupby(), dan terakhir mengurutkan hasilnya dari yang tertinggi menggunakan .sort_values(ascending=False), sebuah fungsi tambahan yang setara dengan ORDER BY DESC pada SQL yang sudah dipelajari di Bab 10. Alur kerja seperti ini, membaca, membersihkan, menggabungkan, mengagregasi, dan mengurutkan data, adalah pola yang sangat umum ditemui dalam pekerjaan nyata seorang Data Analyst yang menggunakan Python dan Pandas.
- Kesejajaran SQL: Filtering `df[kondisi]` = WHERE; `.groupby()` = GROUP BY; `.merge()` = JOIN.
- Kesejajaran Spreadsheet: Series setara 1 kolom; DataFrame setara keseluruhan sheet tabel.
- Penanganan Missing Value: `dropna()` menghapus baris kosong; `fillna()` mengimputasi nilai pengganti.
- Alur Kerja Kompleks: Python Pandas mengotomasi pipeline pembersihan, penggabungan, dan pengurutan data secara terprogram.