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.

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

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

  1. Baris 4-8 dan 10-14: dua DataFrame dibangun dengan skema identik; keduanya memiliki nama dan harga selain kunci kode.
  2. Baris 16-18 (produk.merge(pembelian, on="kode")): tanpa argumen tambahan, pandas memakai suffix default ("_x", "_y"); kolom dari tabel kiri (produk) menjadi nama_x dan harga_x, kolom dari tabel kanan (pembelian) menjadi nama_y dan harga_y.
  3. Kolom kode: tidak menerima suffix karena menjadi kunci pencocokan; nilainya sudah dijamin sama di kedua sisi.
  4. Baris 21-24: dengan suffixes=("_jual", "_beli"), nama kolom langsung menjelaskan asal datanya, sehingga selisih harga_jual - harga_beli (margin) dapat dihitung tanpa menebak makna _x dan _y.
  5. Baris 31-33: suffix identik ("_x", "_x") tidak ditolak pandas, tetapi menghasilkan dua kolom bernama sama; baris 35-39 menunjukkan pandas menolak suffix kosong dengan ValueError.

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.