Inner join membuang setiap baris yang tidak punya pasangan, padahal baris tanpa pasangan sering kali justru informasi yang paling dicari: pelanggan yang belum pernah memesan adalah target promosi, dan pesanan dengan pelanggan tak dikenal adalah temuan audit. pandas menyediakan tiga mode untuk mempertahankan baris-baris tersebut: how="left", how="right", dan how="outer". Ketiganya bekerja pada tabel kiri dan kanan yang sama seperti chapter-chapter sebelumnya, sehingga perbedaannya bisa kita amati langsung berdampingan. Pada Chapter ini kita menjalankan ketiga mode dalam satu skrip, membaca NaN yang muncul, dan mencermati urutan baris hasil masing-masing mode.
how=“left” Semua Baris Tabel Kiri Dipertahankan #
Nilai how="left" menjadikan tabel pertama sebagai acuan: setiap baris tabel kiri muncul di hasil, lengkap atau tidak pasangannya ditemukan. Baris yang menemukan pasangan disandingkan seperti biasa; baris yang tidak menemukan pasangan tetap muncul dengan kolom dari tabel kanan berisi NaN. Urutan baris hasil mengikuti urutan tabel kiri, sehingga laporan berbasis pelanggan tetap terbaca rapi. Mode ini setara dengan LEFT JOIN pada SQL.
how=“right” dan how=“outer” #
Nilai how="right" adalah cermin dari how="left": semua baris tabel kanan dipertahankan dan kolom tabel kiri menampung NaN untuk baris tanpa pasangan. Nilai how="outer" menggabungkan keduanya: setiap baris dari kedua tabel muncul di hasil, dan halaman pandas.merge
menyebutnya sebagai union dari kunci kedua tabel. Skrip berikut menjalankan ketiga mode secara berurutan pada tabel pelanggan dan pesanan yang sudah kita kenal.
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],
})
kiri = pd.merge(pelanggan, pesanan, on="id_pelanggan", how="left")
print(kiri)
print()
kanan = pd.merge(pelanggan, pesanan, on="id_pelanggan", how="right")
print(kanan)
print()
penuh = pd.merge(pelanggan, pesanan, on="id_pelanggan", how="outer")
print(penuh)Output yang Dihasilkan:
id_pelanggan nama kota id_pesanan total
0 P001 Budi Jakarta TRX-201 150000.0
1 P001 Budi Jakarta TRX-203 90000.0
2 P002 Siti Bandung TRX-202 275000.0
3 P003 Dewi Surabaya NaN NaN
id_pelanggan nama kota id_pesanan total
0 P001 Budi Jakarta TRX-201 150000
1 P002 Siti Bandung TRX-202 275000
2 P001 Budi Jakarta TRX-203 90000
3 P004 NaN NaN TRX-204 120000
id_pelanggan nama kota id_pesanan total
0 P001 Budi Jakarta TRX-201 150000.0
1 P001 Budi Jakarta TRX-203 90000.0
2 P002 Siti Bandung TRX-202 275000.0
3 P003 Dewi Surabaya NaN NaN
4 P004 NaN NaN TRX-204 120000.0Mari kita telaah apa yang terjadi pada kode di atas:
- Baris 15-16:
how="left"menghasilkan empat baris; tiga baris pertama adalah pasangan yang cocok, dan barisP003muncul denganNaNdi kolomid_pesanandantotalkarena pelanggan tersebut belum memesan. - Baris 19-20:
how="right"juga menghasilkan empat baris, tetapi urutannya mengikuti tabel kanan; barisTRX-204muncul denganNaNdi kolomnamadankotakarenaP004tidak terdaftar. - Baris 23-24:
how="outer"menghasilkan lima baris; seluruh pelanggan dan seluruh pesanan hadir, dan pandas mengurutkan baris berdasarkan nilai kunci secara leksikografis untuk mode ini.
Tiga mode di atas memperlihatkan satu pola yang konsisten: jumlah baris hasil ditentukan oleh sisi mana yang dipertahankan. Perhatikan pula bahwa total bertipe float64 pada hasil left dan outer karena kolom int64 menerima NaN, sedangkan pada hasil right kolom tersebut tetap int64 karena setiap pesanan mempunyai nilai total.
Membaca NaN pada Hasil Join #
Nilai NaN pada hasil join bukan data yang korup; NaN adalah penanda “tidak ada pasangan”. Pada hasil left, NaN di kolom total berarti pelanggan belum pernah memesan. Pada hasil right, NaN di kolom nama berarti pesanan dimiliki pelanggan yang tidak terdaftar. Membaca pola ini memungkinkan kita menyaring dua jenis temuan dengan satu hasil join: baris yang total-nya kosong untuk daftar target promosi, dan baris yang nama-nya kosong untuk daftar pemeriksaan data. Method isna() dari Section Data Cleaning cukup untuk penyaringan tersebut.
Sampai titik ini, semua contoh memakai satu kolom kunci tunggal. Data nyata sering menuntut kecocokan pada kombinasi beberapa kolom sekaligus, misalnya harga yang berbeda per kota dan per produk. Bila ingin mengulang perbandingan ketiga mode, panduan merging menyatukan seluruh varian join dalam satu halaman. Chapter berikutnya membahas cara menggabungkan tabel dengan kunci majemuk tersebut.