Pada Chapter sebelumnya kita memastikan relasi antar tabel valid sebelum digabungkan. Namun ada situasi yang hampir pasti muncul setelah relasi berhasil dibuat: kedua tabel ternyata memakai nama kolom yang sama, misalnya nama dan harga yang masing-masing ada di tabel produk maupun tabel pembelian. Jika benturan nama ini dibiarkan, hasil merge sulit dirujuk karena satu nama kolom menunjuk dua sumber data yang berbeda. Pada Chapter ini kita belajar cara pandas memberi nama unik pada kolom yang berbenturan melalui parameter suffixes, beserta cara memilih suffix yang membuat hasil merge tetap mudah dibaca dan aman dianalisis.
Mengapa Nama Kolom Saling Berbenturan #
Ketika merge() mencocokkan dua tabel pada kunci kode, pandas memperlakukan kolom kunci secara khusus: kolom kunci muncul sekali saja di hasil karena nilainya identik di kedua sisi. Kolom lain yang namanya sama tidak dapat digabung begitu saja, karena isinya memang berbeda; harga jual pada tabel produk tidak sama dengan harga beli pada tabel pembelian. Agar tabel hasil tetap memiliki nama kolom yang unik, pandas menambahkan akhiran (suffix) hanya pada kolom yang berbenturan. Nama-nama akhiran inilah yang kita tulis di baris kode berikutnya, sehingga kita perlu tahu aturannya secara pasti.
Suffix Default _x dan _y #
Mari kita lihat perilaku bawaan pandas. File berikut menggabungkan tabel produk dengan tabel pembelian pada kunci kode; keduanya sama-sama memiliki kolom nama dan harga.
import pandas as pd
# Dua tabel berbagi kolom "nama" dan "harga" selain kunci "kode"
produk = pd.DataFrame({
"kode": ["P1", "P2", "P3"],
"nama": ["Kopi Gayo", "Teh Melati", "Gula Aren"],
"harga": [85000, 32000, 24000], # harga jual
})
pembelian = pd.DataFrame({
"kode": ["P1", "P2", "P3"],
"nama": ["Kopi Gayo", "Teh Melati", "Gula Aren"],
"harga": [62000, 21000, 15500], # harga beli dari supplier
})
# Suffix default: _x untuk tabel kiri, _y untuk tabel kanan
gabung = produk.merge(pembelian, on="kode")
print(gabung)
print()
# Suffix deskriptif jauh lebih mudah dibaca
gabung2 = produk.merge(pembelian, on="kode", suffixes=("_jual", "_beli"))
print(gabung2)
print()
# Analisis langsung memakai nama kolom baru
gabung2["margin"] = gabung2["harga_jual"] - gabung2["harga_beli"]
print(gabung2[["kode", "nama_jual", "harga_beli", "harga_jual", "margin"]])
print()
# Suffix identik pada kolom yang overlap menghasilkan nama kolom duplikat
gabung3 = produk.merge(pembelian, on="kode", suffixes=("_x", "_x"))
print(list(gabung3.columns))
# Suffix kosong pada kolom yang overlap ditolak pandas
try:
produk.merge(pembelian, on="kode", suffixes=("", ""))
except ValueError as e:
print("ValueError:", e)Output yang Dihasilkan:
kode nama_x harga_x nama_y harga_y
0 P1 Kopi Gayo 85000 Kopi Gayo 62000
1 P2 Teh Melati 32000 Teh Melati 21000
2 P3 Gula Aren 24000 Gula Aren 15500
kode nama_jual harga_jual nama_beli harga_beli
0 P1 Kopi Gayo 85000 Kopi Gayo 62000
1 P2 Teh Melati 32000 Teh Melati 21000
2 P3 Gula Aren 24000 Gula Aren 15500
kode nama_jual harga_beli harga_jual margin
0 P1 Kopi Gayo 62000 85000 23000
1 P2 Teh Melati 21000 32000 11000
2 P3 Gula Aren 15500 24000 8500
['kode', 'nama_x', 'harga_x', 'nama_x', 'harga_x']
ValueError: columns overlap but no suffix specified: Index(['nama', 'harga'], dtype='str')Mari kita telaah bagian-bagian pentingnya:
- Baris 4-8 dan 10-14: dua DataFrame dibangun dengan skema identik; keduanya memiliki
namadanhargaselain kuncikode. - Baris 16-18 (
produk.merge(pembelian, on="kode")): tanpa argumen tambahan, pandas memakai suffix default("_x", "_y"); kolom dari tabel kiri (produk) menjadinama_xdanharga_x, kolom dari tabel kanan (pembelian) menjadinama_ydanharga_y. - Kolom
kode: tidak menerima suffix karena menjadi kunci pencocokan; nilainya sudah dijamin sama di kedua sisi. - Baris 21-24: dengan
suffixes=("_jual", "_beli"), nama kolom langsung menjelaskan asal datanya, sehingga selisihharga_jual - harga_beli(margin) dapat dihitung tanpa menebak makna_xdan_y. - Baris 31-33: suffix identik
("_x", "_x")tidak ditolak pandas, tetapi menghasilkan dua kolom bernama sama; baris 35-39 menunjukkan pandas menolak suffix kosong denganValueError.
Memilih Suffix yang Deskriptif #
Suffix _x dan _y bekerja cepat, tetapi maknanya buram; pembaca kode harus membuka kedua tabel asal untuk tahu _x milik siapa. Kebiasaan yang lebih baik adalah menamai suffix sesuai peran tabel, misalnya ("_jual", "_beli"), ("_2025", "_2026"), atau ("_lama", "_baru"). Dengan nama yang deskriptif, baris gabung2["harga_jual"] sekaligus berfungsi sebagai dokumentasi: kolom tersebut jelas berasal dari tabel harga jual. Parameter suffixes menerima list atau tuple berisi tepat dua string, urutan pertama untuk tabel kiri dan kedua untuk tabel kanan.
Jebakan Suffix yang Sama atau Kosong #
Dua kasus pada akhir file di atas layak dicermati. Pertama, suffixes=("_x", "_x") membuat dua kolom bernama harga_x; pandas tidak menolaknya, tetapi akses gabung3["harga_x"] lalu mengembalikan DataFrame berisi dua kolom, bukan satu Series, sehingga perhitungan berikutnya berperilaku tak terduga. Kedua, suffixes=("", "") langsung ditolak dengan pesan columns overlap but no suffix specified: Index(['nama', 'harga'], dtype='str'); pesan tersebut sekaligus menunjukkan dtype str bawaan pandas 3.0 untuk kolom teks. Jika satu sisi memang tidak butuh akhiran, berikan kombinasi seperti ("_master", "") agar sisi lain tetap bernama asli.
Untuk membaca lebih dalam, halaman user guide merging
merangkum seluruh aturan penggabungan termasuk contoh suffixes, sedangkan detail parameter tersedia pada referensi pandas.DataFrame.merge
dan pandas.merge
; kedua API tersebut menerima argumen yang sama.
Suffix menyelesaikan benturan nama antara dua tabel yang dipasangkan lewat kunci persis. Chapter berikutnya menjawab pertanyaan audit yang berbeda — menemukan sel yang berubah antara dua versi tabel — dengan compare(), lalu berlanjut ke pd.merge_asof() yang memasangkan tabel lewat waktu yang hampir, bukan yang sama persis.