Satu kolom kunci tidak selalu cukup unik untuk mengidentifikasi baris. Harga satu produk bisa berbeda antarkota, sehingga tabel harga hanya bisa diandalkan ketika pasangan kota dan produk dicocokkan sekaligus; mencocokkan kolom produk saja akan menarik harga yang keliru. Untuk kebutuhan seperti ini, parameter on pada pd.merge() menerima daftar kolom, dan pandas menganggap baris cocok hanya jika seluruh kolom dalam daftar bernilai sama. Pada Chapter ini kita membangun laporan penjualan lintas kota dengan kunci majemuk, lalu melanjutkan analisis setelah penggabungan selesai.

Kapan Satu Kolom Kunci Tidak Cukup #

Kunci majemuk dibutuhkan ketika keunikan baris baru tercapai setelah beberapa kolom digabungkan. Tabel transaksi kita memuat penjualan setiap produk di setiap kota; satu produk muncul di lebih dari satu kota, dan satu kota memuat lebih dari satu produk. Tabel harga mengikuti pola yang sama karena setiap kota menetapkan harganya sendiri. Kolom kota saja tidak membedakan produk, dan kolom produk saja tidak membedakan kota, sehingga pasangan (kota, produk) itulah kunci yang benar. Aturan praktisnya sederhana: daftar kolom kunci harus menghasilkan kombinasi yang tidak berulang di masing-masing tabel.

on dengan Daftar Kolom #

Skrip berikut memuat tabel transaksi dan tabel harga, menggabungkannya dengan on=["kota", "produk"], lalu menghitung kolom total dari hasil penggabungan.

python
import pandas as pd

transaksi = pd.DataFrame({
    "kota": ["Jakarta", "Jakarta", "Bandung", "Bandung"],
    "produk": ["Kopi Gayo", "Teh Melati", "Kopi Gayo", "Teh Melati"],
    "unit": [10, 5, 8, 12],
})

harga = pd.DataFrame({
    "kota": ["Jakarta", "Jakarta", "Bandung", "Bandung"],
    "produk": ["Kopi Gayo", "Teh Melati", "Kopi Gayo", "Teh Melati"],
    "harga": [85000, 32000, 87000, 34000],
})

gabungan = pd.merge(transaksi, harga, on=["kota", "produk"])
print(gabungan)
print()

gabungan["total"] = gabungan["unit"] * gabungan["harga"]
print(gabungan)

Output yang Dihasilkan:

text
      kota      produk  unit  harga
0  Jakarta   Kopi Gayo    10  85000
1  Jakarta  Teh Melati     5  32000
2  Bandung   Kopi Gayo     8  87000
3  Bandung  Teh Melati    12  34000

      kota      produk  unit  harga   total
0  Jakarta   Kopi Gayo    10  85000  850000
1  Jakarta  Teh Melati     5  32000  160000
2  Bandung   Kopi Gayo     8  87000  696000
3  Bandung  Teh Melati    12  34000  408000

Mari kita telaah apa yang terjadi pada kode di atas:

  1. Baris 3-7: DataFrame transaksi dibuat dengan empat baris penjualan; pasangan kota dan produk pada tabel ini tidak ada yang berulang.
  2. Baris 9-13: DataFrame harga dibuat dengan struktur pasangan yang sama, tetapi nilai harganya berbeda antar kota untuk produk yang sama.
  3. Baris 15-16: pd.merge(transaksi, harga, on=["kota", "produk"]) mencocokkan kedua tabel pada kombinasi kedua kolom; harga Kopi Gayo yang ditarik untuk baris Jakarta adalah 85000, bukan 87000 milik Bandung.
  4. Baris 19-20: kolom total dihitung dari unit dikali harga setelah penggabungan, dan hasilnya adalah laporan nilai penjualan per kota per produk.

Perhatikan urutan kolom pada hasil: kolom kunci kota dan produk muncul lebih dulu, disusul kolom dari tabel kiri, lalu kolom dari tabel kanan. Kecocokan berjalan baris demi baris pada seluruh kombinasi kunci; satu kolom saja yang berbeda membuat pasangan tersebut tidak cocok. Halaman pandas.merge mendokumentasikan parameter on yang menerima label tunggal maupun list, dan panduan merging memuat contoh kunci majemuk dengan tabel yang lebih besar.

Melanjutkan Analisis Setelah Join #

Kolom total pada skrip menunjukkan pola kerja yang lazim: merge dulu, analisis kemudian. Setelah tabel tergabung, seluruh alat yang sudah kita pelajari berlaku normal, mulai dari groupby untuk rekap per kota hingga sort_values() untuk peringkat produk. Satu risiko yang perlu dijaga adalah kunci ganda yang lolos dari pemeriksaan: satu kombinasi kota, produk yang berulang di tabel harga akan melipatgandakan baris transaksinya secara senyap, dan kolom total ikut terhitung dua kali pada rekap berikutnya. Kesalahan semacam ini berdampak besar pada laporan, tetapi sebenarnya bisa dicegah oleh pandas sendiri. Chapter berikutnya memperkenalkan parameter validate yang membuat pandas memeriksa relasi kunci secara otomatis dan memunculkan error yang jelas ketika pola relasi menyimpang.