Pandas merge: Gabung DataFrame ala JOIN SQL
TL;DR
pandas merge menggabungkan dua DataFrame berdasarkan kolom kunci yang sama, mirip JOIN di SQL. Sintaks dasarnya pd.merge(df1, df2, on='kolom_kunci', how='inner'). Parameter how menentukan tipe join: inner, left, right, atau outer. Pakai left join kalau kamu mau simpan semua baris DataFrame kiri.
pandas merge itu cara nyatuin dua DataFrame lewat kolom kunci yang sama, persis kayak JOIN di SQL.
Misalnya kamu punya satu tabel transaksi dan satu tabel produk. merge nyambungin keduanya lewat kode produk, jadi tiap transaksi langsung dapat nama dan harga produknya.
Di artikel ini kamu bakal belajar sintaks dasar, empat tipe join, cara gabung waktu nama kolomnya beda, dan kesalahan yang bikin baris kamu tiba-tiba jadi dobel.
Apa itu pandas merge?
pandas merge adalah fungsi buat menggabungkan dua DataFrame berdasarkan satu atau lebih kolom kunci. pandas nyocokin nilai di kolom kunci, lalu nempelin kolom dari DataFrame kedua ke baris yang cocok di DataFrame pertama. Hasilnya satu DataFrame yang lebih lebar.
Sintaks dasarnya:
import pandas as pd
hasil = pd.merge(df_kiri, df_kanan, on="kode_produk", how="inner")Tiga bagian penting:
- df_kiri dan df_kanan: dua DataFrame yang mau digabung.
- on: nama kolom kunci yang ada di dua DataFrame.
- how: tipe join, nentuin baris mana yang disimpan.
Konsep ini sama persis dengan JOIN di SQL. Kalau kamu udah paham JOIN, merge bakal kerasa familiar. Baca perbedaan jenis JOIN di SQL buat bandingin polanya.
Apa saja tipe join di pandas merge?
Ada empat tipe yang diatur lewat parameter how. Tiap tipe nentuin baris mana yang ikut ke hasil akhir.
| how | Yang disimpan | Padanan SQL |
|---|---|---|
| inner | cuma baris yang cocok di dua sisi | INNER JOIN |
| left | semua baris kiri, cocok atau nggak | LEFT JOIN |
| right | semua baris kanan | RIGHT JOIN |
| outer | semua baris dari dua sisi | FULL OUTER JOIN |
Default-nya inner. Artinya kalau ada kode produk yang cuma ada di satu tabel, baris itu bakal hilang dari hasil. Ini sumber bug yang sering bikin data berkurang tanpa sadar.
Gimana cara pakai left join di pandas?
Left join nyimpen semua baris dari DataFrame kiri, walaupun nggak ketemu pasangannya di kanan. Kolom dari kanan yang nggak cocok bakal diisi NaN. Ini tipe yang paling sering dipakai buat analisa.
hasil = pd.merge(
transaksi,
produk,
on="kode_produk",
how="left"
)Contoh, kamu punya 5.000 transaksi tapi tabel produk cuma isi 480 item. Dengan left join, semua 5.000 transaksi tetap ada. Kalau ada transaksi yang kode produknya nggak terdaftar, kolom nama produknya jadi NaN, dan itu justru sinyal ada data master yang kurang.
Buat cek transaksi yang nggak ketemu produknya, filter baris yang NaN:
tidak_cocok = hasil[hasil["nama_produk"].isna()]
print(len(tidak_cocok), "transaksi tanpa data produk")Gimana kalau nama kolom kuncinya beda?
Kalau kolom kunci di dua DataFrame beda nama, pakai left_on dan right_on, bukan on. Kamu sebut nama kolom di masing-masing sisi.
hasil = pd.merge(
transaksi,
produk,
left_on="kode_produk",
right_on="id_produk",
how="left"
)Setelah merge, kamu bakal punya dua kolom kunci yang isinya sama. Buang salah satu biar rapi:
hasil = hasil.drop(columns=["id_produk"])Kalau kunci gabungnya lebih dari satu kolom, kasih daftar ke on, misal on=["kode_produk", "cabang"]. pandas bakal nyocokin kombinasi kedua kolom itu.
Contoh kasus: gabung transaksi dan produk toko_berkah
Toko_berkah punya dua file: transaksi.csv berisi 5.240 baris penjualan, dan produk.csv berisi 480 master produk dengan harga modal.
transaksi = pd.read_csv("transaksi.csv")
produk = pd.read_csv("produk.csv")
df = pd.merge(transaksi, produk, on="kode_produk", how="left")
df["margin"] = df["harga_jual"] - df["harga_modal"]Setelah digabung, aku bisa ngitung margin tiap transaksi. Ternyata dari 5.240 transaksi, ada 137 baris yang harga_modal-nya NaN. Kode produknya nggak ada di master, sekitar 2,6% transaksi jalan tanpa data modal.
Setelah master produk dilengkapi, total margin sebulan naik dari yang tercatat Rp 71 juta jadi Rp 78,4 juta. Selisih Rp 7,4 juta itu margin yang tadinya nggak kehitung gara-gara data master bolong.
Buat langkah lanjutan pengolahan data kayak gini, cek panduan pengolahan data yang bahas alur bersih-gabung-analisa.
Kesalahan umum waktu pakai merge
- Lupa how, kepakai inner diam-diam. Default inner buang baris yang nggak cocok. Kalau jumlah baris berkurang setelah merge, ini biang keladinya.
- Kolom kunci ada duplikat. Kalau kunci di sisi kanan nggak unik, baris kiri kegandain. 5.000 baris bisa jadi 9.000 tanpa kamu sadar.
- Tipe data kunci beda. Kode 100 sebagai angka nggak cocok sama "100" sebagai teks. Samain dulu pakai astype.
- Spasi tersembunyi di kunci teks. "A01 " dan "A01" dianggap beda. Bersihin pakai str.strip().
Buat ngecek apakah baris kegandain, bandingin jumlah baris sebelum dan sesudah:
print("sebelum:", len(transaksi))
print("sesudah:", len(df))Kalau angka sesudah lebih besar, kunci kanan kamu nggak unik. Ini pola yang mirip bug di INNER JOIN SQL, cuma di pandas.
FAQ
Apa beda pandas merge dan concat?
merge nyambungin dua DataFrame lewat nilai di kolom kunci, jadi dia nyocokin baris berdasarkan isinya. concat cuma numpuk DataFrame, entah ke bawah atau ke samping, tanpa nyocokin kunci apa pun. Pakai merge kalau kamu mau nempelin informasi berdasarkan ID yang cocok. Pakai concat kalau kamu cuma mau nyatuin data yang strukturnya sama, misal gabungin file penjualan Januari dan Februari.
Kenapa jumlah baris saya membengkak setelah merge?
Karena kolom kunci di salah satu DataFrame punya nilai yang berulang. Waktu satu baris kiri cocok sama tiga baris kanan, pandas bikin tiga baris hasil. Cek keunikan kunci pakai df['kunci'].duplicated().sum() sebelum merge. Kalau kunci kanan harusnya unik tapi ternyata duplikat, bersihin dulu tabel master-nya, atau agregasi biar satu kunci cuma punya satu baris.
Gimana cara merge lebih dari dua DataFrame?
merge cuma nangani dua DataFrame sekali jalan, tapi kamu bisa rantai. Gabung dua dulu, lalu hasilnya digabung lagi ke DataFrame ketiga. Cara ringkasnya pakai functools.reduce dengan daftar DataFrame. Pastikan tiap tahap pakai tipe join yang benar, biasanya left join, biar baris utama kamu nggak kepotong di tengah rantai.
Apa itu parameter indicator di merge?
Parameter indicator=True nambah kolom bernama _merge yang nunjukin asal tiap baris: both kalau cocok di dua sisi, left_only kalau cuma ada di kiri, right_only kalau cuma di kanan. Ini alat cek yang berguna banget buat ngaudit hasil merge. Kamu bisa langsung lihat berapa baris yang nggak nemu pasangan tanpa nebak-nebak.
Merge pakai on atau join pakai index, pilih mana?
Pakai merge dengan on kalau kunci gabungnya kolom biasa, ini kasus paling umum. Method df.join lebih pas kalau kamu mau gabung berdasarkan index DataFrame, dan biasanya lebih cepat buat itu. Buat analis pemula, tetap pakai merge dengan on karena lebih jelas kolom mana yang jadi kunci dan lebih mirip cara berpikir SQL.
Penutup
Yang perlu kamu inget: merge butuh kolom kunci dan parameter how. Pilih left join buat nyimpen semua baris utama, cek tipe data kunci biar cocok, dan bandingin jumlah baris sebelum-sesudah biar tau kalau ada yang kegandain.
Sekarang coba di data kamu sendiri. Mau latihan SQL dulu biar konsep JOIN-nya nempel? Cek NgulikSQL buat praktek JOIN dengan dataset Indonesia di browser.
Lanjut baca perbedaan jenis JOIN di SQL, atau lihat dokumentasi resmi pandas.merge buat semua parameternya.
Mau praktek langsung? Mulai latihan SQL gratis
Latihan interaktif, langsung di browser.
Artikel terkait
NumPy reshape: Ubah Bentuk Array (2026)
Fungsi reshape di NumPy ngatur ulang bentuk array tanpa ngubah datanya. Ini cara pakainya, arti angka -1, dan cara ngeflat array.
NumPy Array: Dasar-Dasar untuk Analis Data (2026)
NumPy array bikin hitungan data di Python jauh lebih cepat dari list biasa. Ini dasar bikin, slicing, dan operasi array buat analis.
Alternatif iterrows yang Lebih Cepat di Pandas
iterrows nyaman ditulis tapi lambat. Ini urutan alternatif iterrows di pandas dari yang tercepat, plus benchmark biar kamu tau kapan pakai yang mana.