pd.merge() tidak pernah memeriksa keunikan kunci; fungsi tersebut hanya mencocokkan nilai dan melipatgandakan baris sesuai kecocokan yang ditemukan. Akibatnya, satu data kunci ganda yang lolos dari sumber cukup untuk membuat laporan terhitung dua kali tanpa pesan apa pun. Parameter validate mengubah perilaku ini: kita menyatakan pola relasi yang diharapkan antara kedua tabel, dan pandas memeriksa pola tersebut sebelum mengembalikan hasil. Bila pola dilanggar, pandas memunculkan MergeError dengan pesan yang jelas, bukan hasil yang diam-diam salah. Pada Chapter ini kita membungkus Section penggabungan join dengan pengaman tersebut: relasi one-to-one, relasi one-to-many, dan error yang muncul saat janji dilanggar.

Dua Relasi yang Sering Muncul #

Relasi antar tabel punya pola yang bisa dinyatakan dalam kata-kata. Relasi one-to-one berarti satu baris di tabel kiri berpasangan dengan tepat satu baris di tabel kanan, seperti tabel pelanggan dengan tabel poin loyalitas yang mencatat satu nilai poin per pelanggan. Relasi one-to-many berarti satu baris di tabel kiri boleh berpasangan dengan beberapa baris di tabel kanan, seperti satu pelanggan yang memiliki banyak pesanan. Mengenali pola yang seharusnya adalah tugas kita sebagai perancang data; tugas pandas adalah memastikan data benar-benar mengikuti pola itu. Halaman pandas.merge mendokumentasikan parameter validate beserta seluruh nilainya.

Contoh: validate=“one_to_one” dan “one_to_many” #

Skrip berikut menjalankan dua merge yang sah, lalu satu merge yang sengaja melanggar janji relasi agar errornya terlihat.

python
import pandas as pd
from pandas.errors import MergeError

pelanggan = pd.DataFrame({
    "id_pelanggan": ["P001", "P002", "P003"],
    "nama": ["Budi", "Siti", "Dewi"],
})

poin = pd.DataFrame({
    "id_pelanggan": ["P001", "P002", "P003"],
    "poin": [120, 340, 80],
})

pesanan = pd.DataFrame({
    "id_pesanan": ["TRX-201", "TRX-202", "TRX-203", "TRX-204"],
    "id_pelanggan": ["P001", "P002", "P001", "P004"],
    "total": [150000, 275000, 90000, 120000],
})

ringkasan = pd.merge(pelanggan, poin, on="id_pelanggan", validate="one_to_one")
print(ringkasan)
print()

detail = pd.merge(pelanggan, pesanan, on="id_pelanggan", validate="one_to_many")
print("Baris hasil one_to_many:", len(detail))
print()

try:
    pd.merge(pelanggan, pesanan, on="id_pelanggan", validate="one_to_one")
except MergeError as exc:
    print("MergeError:", str(exc).splitlines()[0])

Output yang Dihasilkan:

text
  id_pelanggan  nama  poin
0         P001  Budi   120
1         P002  Siti   340
2         P003  Dewi    80

Baris hasil one_to_many: 3

MergeError: Merge keys are not unique in right dataset; not a one-to-one merge

Mari kita telaah apa yang terjadi pada kode di atas:

  1. Baris 4-18: tiga tabel disiapkan; poin memuat tepat satu baris per pelanggan, sedangkan pesanan memuat dua baris untuk kunci P001.
  2. Baris 20-21: merge pelanggan dengan poin memakai validate="one_to_one"; kedua tabel unik pada kunci, sehingga penggabungan lolos dan tabel ringkasan tercetak.
  3. Baris 24-25: merge pelanggan dengan pesanan memakai validate="one_to_many"; kunci unik di tabel kiri dan boleh berulang di tabel kanan, sehingga penggabungan juga lolos.
  4. Baris 28-31: merge yang sama diulang dengan janji one_to_one; pandas menemukan kunci P001 berulang di tabel kanan, memunculkan MergeError, dan skrip menangkapnya lalu mencetak baris pertama pesan error.

Pesan error pada output menyebut sisi yang bermasalah secara spesifik: kunci tidak unik di dataset kanan, sehingga pola one-to-one tidak terpenuhi. Pesan lengkap dari MergeError juga memuat daftar kunci yang berulang; skrip kita hanya menampilkan baris pertamanya agar output tetap ringkas. Informasi ini langsung mengarahkan kita ke sisi data yang perlu diperiksa, tanpa perlu membaca seluruh tabel secara manual.

Empat Nilai Parameter validate #

Parameter validate menerima empat nilai yang mencakup semua kombinasi pola relasi.

Nilai validateJanji relasiContoh
"one_to_one"Kunci unik di kedua tabelpelanggan dengan poin
"one_to_many"Kunci unik di kiri, boleh berulang di kananpelanggan dengan pesanan
"many_to_one"Kunci boleh berulang di kiri, unik di kananpesanan dengan pelanggan
"many_to_many"Kunci boleh berulang di kedua tabelRekap harian dengan kategori

Nilai "many_to_many" jarang dipakai sebagai pengaman karena hampir semua data lolos; nilai lainnya justru yang berperan sebagai pemeriksa. Kesalahan memilih nilai juga aman: pandas memunculkan MergeError saat pola tidak sesuai, dan error semacam itu jauh lebih mudah diperbaiki daripada laporan yang salah secara senyap. Kelas errornya diekspor dari modul pandas.errors.MergeError , sehingga kita dapat menangkapnya dengan try/except seperti pada skrip.

Dengan validate, seluruh alur join pada Section ini kini berjalan dengan terkendali: concat untuk penumpukan dan penyandingan, pd.merge() dengan empat mode how untuk relasi berbasis kunci, kunci majemuk untuk kombinasi kolom, dan validasi relasi sebagai pengaman. Satu bekas merge yang belum kita bersihkan adalah kolom non-kunci dengan nama sama yang mendapat akhiran _x dan _y; Chapter berikutnya membahas parameter suffixes untuk mengatur akhiran tersebut. Setelah itu, pembahasan berlanjut ke pd.merge_asof() untuk kunci berbasis waktu, lalu ke keluarga method pembentuk bentuk tabel seperti pivot() dan melt().