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.
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:
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.
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.
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")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.
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.
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.
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.
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.
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.
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.
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.
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.
Nama toko ketik campur huruf besar-kecil, spasi nyasar di ujung, atau kode produk nempel jadi satu. Accessor .str di pandas ngerapiin semua itu tanpa loop.
Model machine learning cuma ngerti angka, bukan teks kayak merah atau biru. get_dummies ngubah kolom kategori jadi kolom 0/1 dalam satu baris kode.
Cara pakai pandas crosstab buat bikin tabel silang yang menghitung frekuensi antar dua kategori. Contoh analisis kategori produk per kota UMKM.