Pada Chapter sebelumnya, pd.merge() dipanggil tanpa parameter how, dan hasilnya hanya memuat baris yang kuncinya ditemukan di kedua tabel. Perilaku default tersebut disebut inner join, dan kita dapat menuliskannya secara eksplisit dengan how="inner". Inner join mempertahankan baris hanya ketika nilai kuncinya ditemukan di tabel kiri sekaligus tabel kanan; baris tanpa pasangan dibuang dari kedua sisi. Chapter ini membahas aturan inner join secara sengaja mendetail, karena keputusan membuang baris inilah yang paling sering menentukan benar-tidaknya laporan.

Aturan Inner Join #

Inner join bekerja pada irisan (intersection) nilai kunci kedua tabel. Pandas memprosesnya dengan langkah berikut: cari semua pasangan baris yang nilai kuncinya sama, tampilkan setiap pasangan sebagai satu baris hasil, dan buang baris yang kuncinya tidak punya pasangan. Satu nilai kunci yang muncul beberapa kali tetap menghasilkan beberapa baris, seperti kasus P001 pada Chapter pd.merge(). Yang dibuang hanyalah kunci yang tidak mempunyai pasangan sama sekali. Aturan ini membuat hasil inner join selalu “lengkap dua arah”: setiap baris hasil memenuhi syarat di kedua tabel.

Contoh dengan how=“inner” Eksplisit #

Skrip berikut mengulang tabel pelanggan dan pesanan dari Chapter sebelumnya, kali ini dengan how="inner" tertulis jelas. Skrip juga mencetak jumlah baris setiap tabel agar dampak penggabungan terukur.

python
import pandas as pd

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

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

cocok = pd.merge(pelanggan, pesanan, on="id_pelanggan", how="inner")
print(cocok)
print()

print("Baris pelanggan :", len(pelanggan))
print("Baris pesanan   :", len(pesanan))
print("Baris hasil     :", len(cocok))

Output yang Dihasilkan:

text
  id_pelanggan  nama     kota id_pesanan   total
0         P001  Budi  Jakarta    TRX-201  150000
1         P001  Budi  Jakarta    TRX-203   90000
2         P002  Siti  Bandung    TRX-202  275000

Baris pelanggan : 3
Baris pesanan   : 4
Baris hasil     : 3

Mari kita telaah apa yang terjadi pada kode di atas:

  1. Baris 3-13: kedua tabel dibuat dengan data yang sama seperti Chapter pd.merge(), termasuk pelanggan P003 yang belum pernah memesan dan pesanan TRX-204 milik P004 yang tidak terdaftar.
  2. Baris 15-16: pd.merge(..., how="inner") menggabungkan kedua tabel; hasilnya tiga baris pesanan yang seluruhnya terdaftar.
  3. Baris 19-21: tiga pemanggilan len() menghitung baris tabel kiri, tabel kanan, dan hasil; angka-angka ini yang kita bandingkan untuk membaca dampak join.

Bandingkan angka pada output: tabel kiri memuat 3 baris, tabel kanan memuat 4 baris, sedangkan hasilnya hanya 3 baris. Pelanggan P003 tidak muncul karena belum memiliki pesanan, dan pesanan TRX-204 tidak muncul karena pelanggannya tidak terdaftar. Kedua baris itu dibuang oleh inner join dari sisi yang berbeda, dan hasil yang tersisa mewakili pesanan yang datanya lengkap dua arah.

Kapan Inner Join Tepat Dipakai #

Inner join adalah pilihan yang tepat ketika laporan menuntut kecocokan penuh antara dua tabel. Contohnya: daftar penagihan hanya boleh memuat pesanan yang pelanggannya terdaftar, atau analisis perilaku yang membandingkan profil pelanggan dengan transaksinya. Dengan inner join, hasil bebas NaN dari baris tanpa pasangan, sehingga perhitungan lanjutan tidak perlu menangani nilai kosong. Halaman pandas.merge mendokumentasikan how="inner" sebagai nilai default, dan panduan merging menunjukkan pemetaannya ke INNER JOIN SQL.

Kebalikan dari pembuangan senyap ini adalah mempertahankan baris tanpa pasangan dan menandainya dengan NaN. Ketika baris tanpa pasangan justru informasi yang dicari, misalnya pelanggan yang belum pernah memesan, kita membutuhkan how="left", how="right", dan how="outer". Ketiga varian itulah yang kita bedah satu per satu pada Chapter berikutnya.