Sistem toko menyimpan data pelanggan dan data pesanan dalam dua tabel terpisah agar setiap informasi hanya tersimpan satu kali: nama dan kota pelanggan hidup di tabel pelanggan, sementara daftar transaksi hidup di tabel pesanan. Laporan “siapa membeli apa” menuntut kedua tabel digabung, dan penghubungnya adalah kolom id_pelanggan. Fungsi pd.merge() menggabungkan dua DataFrame berdasarkan nilai kolom kunci semacam itu. Mekanisme ini identik dengan operasi JOIN pada SQL, sehingga pembaca yang pernah menulis query database dapat memindahkan pemahamannya langsung ke pandas. Pada Chapter ini kita mempelajari bentuk dasar pd.merge(), pemetaan parameternya ke SQL, dan perilakunya ketika kunci muncul lebih dari satu kali.
Analogi JOIN pada SQL #
pd.merge() memakai kosakata yang sama dengan SQL karena keduanya menyelesaikan masalah yang sama: menyandingkan baris dari dua tabel lewat kunci. Parameter on berperan seperti klausa ON, parameter how berperan seperti jenis JOIN, dan dua argumen pertama adalah tabel kiri serta tabel kanan. Tabel berikut merangkum pemetaannya.
| SQL | pandas |
|---|---|
t1 JOIN t2 ON kunci | pd.merge(t1, t2, on="kunci") |
INNER JOIN | how="inner" (nilai default) |
LEFT JOIN | how="left" |
RIGHT JOIN | how="right" |
FULL OUTER JOIN | how="outer" |
Perbedaannya terletak pada tempat eksekusi: pd.merge() bekerja pada DataFrame di memori tanpa server database. Halaman pandas.merge
merinci seluruh parameter yang didukung, termasuk variasi yang akan kita bahas pada chapter-chapter berikutnya.
Contoh: Laporan Pesanan dengan Nama Pelanggan #
Skrip berikut membangun kedua tabel lalu menggabungkannya lewat kolom id_pelanggan. Tabel pesanan sengaja memuat empat baris: dua pesanan untuk P001, satu untuk P002, dan satu untuk P004 yang tidak terdaftar di tabel pelanggan.
import pandas as pd
pelanggan = pd.DataFrame({
"id_pelanggan": ["P001", "P002", "P003"],
"nama": ["Budi", "Siti", "Dewi"],
"kota": ["Jakarta", "Bandung", "Surabaya"],
})
pesanan = pd.DataFrame({
"id_pesanan": ["TRX-201", "TRX-202", "TRX-203", "TRX-204"],
"id_pelanggan": ["P001", "P002", "P001", "P004"],
"total": [150000, 275000, 90000, 120000],
})
laporan = pd.merge(pelanggan, pesanan, on="id_pelanggan")
print(laporan)Output yang Dihasilkan:
id_pelanggan nama kota id_pesanan total
0 P001 Budi Jakarta TRX-201 150000
1 P001 Budi Jakarta TRX-203 90000
2 P002 Siti Bandung TRX-202 275000Mari kita telaah apa yang terjadi pada kode di atas:
- Baris 3-7: DataFrame
pelanggandibuat dengan tiga kolom; kolomid_pelangganmenjadi kunci relasi. - Baris 9-13: DataFrame
pesanandibuat dengan kolomid_pelangganyang merujuk ke tabel pertama, plus dua pesanan untuk kunciP001. - Baris 15:
pd.merge(pelanggan, pesanan, on="id_pelanggan")mencari pasangan baris yang nilai kuncinya sama, lalu menyandingkan kolom kedua tabel dalam satu baris. - Baris 16: laporan dicetak; hasilnya tiga baris karena
TRX-204tidak mempunyai pasanganP004di tabel pelanggan.
Hasil di output menunjukkan setiap pesanan kini membawa nama dan kota pemesannya. Pesanan TRX-201 dan TRX-203 sama-sama berpasangan dengan baris Budi karena keduanya memakai kunci P001.
Kunci Duplikat dan Bentuk Hasil #
Baris Budi muncul dua kali pada hasil meskipun tabel pelanggan hanya memuatnya satu kali. Ketika satu nilai kunci muncul beberapa kali di salah satu tabel, pandas menduplikasi baris pasangannya untuk setiap kecocokan; pola ini disebut relasi one-to-many dan merupakan perilaku yang benar untuk data pesanan. Konsekuensinya, jumlah baris hasil tidak selalu sama dengan jumlah baris salah satu tabel: tiga pelanggan dan empat pesanan menghasilkan tiga baris laporan, bukan empat, karena TRX-204 tidak punya pasangan pada mode default. Bila suatu saat hasil merge terasa terlalu panjang, periksa dulu keunikan kunci di kedua tabel sebelum menyalahkan data lainnya. Method yang setara juga tersedia langsung pada objek DataFrame: pelanggan.merge(pesanan, on="id_pelanggan") bekerja identik dan didokumentasikan pada halaman pandas.DataFrame.merge
.
Urutan baris hasil juga patut dicermati: pandas menyusun baris mengikuti urutan nilai kunci pada tabel kiri untuk mode default, sehingga urutan asli tabel kanan tidak dipertahankan. Bila laporan menuntut urutan tertentu, jalankan sort_values() setelah merge seperti yang dipelajari pada Section Manipulasi Data. Panduan merging
di dokumentasi resmi memuat diagram dan contoh tambahan untuk semua varian. Mode default pd.merge() membuang baris tanpa pasangan, dan keputusan ini perlu diambil dengan sadar; Chapter berikutnya membahas khusus perilaku inner join beserta cara mengukur dampaknya.