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.
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:
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 mergeMari kita telaah apa yang terjadi pada kode di atas:
- Baris 4-18: tiga tabel disiapkan;
poinmemuat tepat satu baris per pelanggan, sedangkanpesananmemuat dua baris untuk kunciP001. - Baris 20-21: merge
pelanggandenganpoinmemakaivalidate="one_to_one"; kedua tabel unik pada kunci, sehingga penggabungan lolos dan tabel ringkasan tercetak. - Baris 24-25: merge
pelanggandenganpesananmemakaivalidate="one_to_many"; kunci unik di tabel kiri dan boleh berulang di tabel kanan, sehingga penggabungan juga lolos. - Baris 28-31: merge yang sama diulang dengan janji
one_to_one; pandas menemukan kunciP001berulang di tabel kanan, memunculkanMergeError, 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 validate | Janji relasi | Contoh |
|---|---|---|
"one_to_one" | Kunci unik di kedua tabel | pelanggan dengan poin |
"one_to_many" | Kunci unik di kiri, boleh berulang di kanan | pelanggan dengan pesanan |
"many_to_one" | Kunci boleh berulang di kiri, unik di kanan | pesanan dengan pelanggan |
"many_to_many" | Kunci boleh berulang di kedua tabel | Rekap 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().