pythonpandasmergeMenengah6 mnt baca

Menggabungkan Tabel dengan merge()

Kuasai inner, left, right, dan outer join lewat merge(), gabungkan tabel transaksi dengan tabel produk memakai kunci yang tepat, dan atasi kolom kembar dengan suffixes.

Kenapa Data Selalu Terpisah-pisah

Di dunia nyata, data hampir tidak pernah tersimpan dalam satu tabel rapi. Tabel transaksi menyimpan kode_produk dan jumlah, tapi nama produk dan harganya ada di tabel produk yang lain. Ini seperti daftar hadir yang hanya berisi nomor induk, sedangkan nama siswanya ada di buku induk yang berbeda. Untuk menganalisis, kamu harus mencocokkan keduanya, dan di pandas caranya adalah merge().

Untuk data analyst, join adalah pekerjaan harian. Laporan omzet per kategori butuh gabungan tabel transaksi dan produk, analisis performa kasir butuh gabungan tabel transaksi dan karyawan. Salah memilih jenis join bisa membuat transaksi hilang diam-diam atau malah menggandakan baris, jadi ini materi yang wajib dikuasai sampai refleks.

Empat Jenis Join dalam Satu Fungsi

python
import pandas as pd

transaksi = pd.DataFrame({
    "order_id": ["A1", "A2", "A3"],
    "kode_produk": ["P1", "P2", "P9"],
    "qty": [2, 1, 3],
})
produk = pd.DataFrame({
    "kode_produk": ["P1", "P2", "P3"],
    "nama": ["Kopi", "Teh", "Susu"],
    "harga": [15000, 8000, 12000],
})

print(pd.merge(transaksi, produk, on="kode_produk", how="inner"))
print(pd.merge(transaksi, produk, on="kode_produk", how="left"))

Empat nilai how yang perlu kamu hafal:

  • inner: hanya baris yang kuncinya ada di kedua tabel. Order A3 (produk P9 yang tidak ada di tabel produk) hilang.
  • left: pertahankan semua baris tabel kiri (transaksi), isi NaN kalau tidak ada pasangannya. Ini default paling aman untuk laporan penjualan.
  • right: kebalikan dari left, pertahankan semua baris tabel kanan.
  • outer: gabungkan semuanya, yang tidak punya pasangan diisi NaN.

Contoh Realistis: Transaksi + Produk + suffixes

python
import pandas as pd

transaksi = pd.DataFrame({
    "order_id": ["A1", "A2", "A3", "A4"],
    "kode_produk": ["P1", "P2", "P1", "P9"],
    "qty": [2, 1, 1, 5],
    "tanggal": ["2026-10-01"] * 4,
})
produk = pd.DataFrame({
    "kode_produk": ["P1", "P2", "P3"],
    "nama": ["Kopi Tubruk", "Teh Manis", "Susu Jahe"],
    "harga": [15000, 8000, 12000],
    "tanggal": ["2026-01-01"] * 3,  # tanggal input master produk
})

gabung = pd.merge(transaksi, produk, on="kode_produk", how="left",
                  suffixes=("_trx", "_master"))
gabung["omzet"] = gabung["qty"] * gabung["harga"]
print(gabung[["order_id", "nama", "qty", "omzet"]])
print("Total omzet:", gabung["omzet"].sum())

Perhatikan dua hal. Pertama, how="left" menjaga order A4 tetap muncul meski produk P9 tidak dikenal (harga jadi NaN, dan itu sinyal untuk investigasi, bukan untuk dihapus diam-diam). Kedua, kedua tabel punya kolom tanggal dengan arti berbeda, jadi suffixes mencegah salah satunya tertimpa.

Catatan teknis: kalau kunci di tabel kanan tidak unik (satu kode produk muncul dua kali di tabel produk), hasil merge meledak jadi perkalian baris. Cegah dengan validate="m:1" supaya pandas protes kalau asumsi satu-ke-banyak dilanggar.

Jebakan Umum

SALAH: memakai inner join default untuk laporan omzet.

python
pd.merge(transaksi, produk, on="kode_produk")  # transaksi produk tak dikenal hilang

BENAR: pakai left join supaya tidak ada transaksi yang hilang diam-diam, lalu investigasi baris yang harga-nya NaN.

python
pd.merge(transaksi, produk, on="kode_produk", how="left")

SALAH: menggabungkan dengan nama kolom yang ambigu tanpa suffixes.

python
pd.merge(a, b, on="id")  # kolom 'tanggal' dari salah satu tabel tertimpa

BENAR: selalu pasang suffixes=("_kiri", "_kanan") kalau kedua tabel punya kolom non-kunci dengan nama sama, supaya tidak ada data yang hilang tanpa jejak.

Tantangan

Gabungkan Transaksi dan Produk

Diberikan DataFrame transaksi (order_id, kode_produk, qty) dan DataFrame produk (kode_produk, nama, harga). Gabungkan dengan left join, hitung kolom omzet (qty * harga), tampilkan 5 baris pertama, dan sebutkan order mana yang produknya tidak dikenal.