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.

SQLpandas
t1 JOIN t2 ON kuncipd.merge(t1, t2, on="kunci")
INNER JOINhow="inner" (nilai default)
LEFT JOINhow="left"
RIGHT JOINhow="right"
FULL OUTER JOINhow="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.

python
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:

text
  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  275000

Mari kita telaah apa yang terjadi pada kode di atas:

  1. Baris 3-7: DataFrame pelanggan dibuat dengan tiga kolom; kolom id_pelanggan menjadi kunci relasi.
  2. Baris 9-13: DataFrame pesanan dibuat dengan kolom id_pelanggan yang merujuk ke tabel pertama, plus dua pesanan untuk kunci P001.
  3. Baris 15: pd.merge(pelanggan, pesanan, on="id_pelanggan") mencari pasangan baris yang nilai kuncinya sama, lalu menyandingkan kolom kedua tabel dalam satu baris.
  4. Baris 16: laporan dicetak; hasilnya tiga baris karena TRX-204 tidak mempunyai pasangan P004 di 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.