0Pricing
Pandas & NumPy Academy · Pelajaran

Gabungan Kiri dan Kanan

Lakukan gabungan kiri dan kanan untuk mempertahankan semua baris dari satu tabel sambil mencocokkan rekaman dari tabel lain.

Gabungan Kiri dan Kanan adalah pelajaran Pandas & NumPy Academy gratis di CoddyKit. Ini adalah pelajaran 3 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Pandas & NumPy Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Pandas & NumPy Academy mencakup 4 pelajaran total.

Join Asimetris

Inner dan outer join memperlakukan kedua DataFrames secara simetris. Namun, sering kali Anda ingin mempertahankan semua data dari satu tabel sambil menambahkan data dari tabel lain. Di sinilah left join dan right join digunakan. Join asimetris ini sangat umum dalam analitik: pertahankan semua transaksi, tambahkan nama produk jika tersedia; pertahankan semua pengguna, tambahkan tanggal pembelian terakhir mereka jika ada.

Left Join: Mempertahankan Semua Baris Kiri

left join (how='left') mempertahankan setiap baris dari DataFrame kiri. Untuk baris yang menemukan kunci yang cocok di DataFrame kanan, kolom kanan diisi dengan nilai yang cocok. Untuk baris tanpa kecocokan, kolom kanan diisi dengan NaN. Jumlah baris hasil selalu sama dengan jumlah baris DataFrame kiri (dengan asumsi tidak ada kunci duplikat).

import pandas as pd

orders = pd.DataFrame({
    'order_id': [1, 2, 3, 4],
    'customer_id': [101, 102, 101, 999],
    'amount': [250, 80, 320, 150]
})
customers = pd.DataFrame({
    'customer_id': [101, 102, 103],
    'name': ['Alice', 'Bob', 'Carol']
})

result = pd.merge(orders, customers, on='customer_id', how='left')
print(result)
# All 4 orders kept; order with customer_id=999 gets NaN for name

Struktur Hasil Left Join

Setelah left join, baris dari DataFrame kiri yang tidak menemukan kecocokan di sisi kanan akan memiliki NaN di setiap kolom yang berasal dari tabel kanan. Anda dapat menggunakan ini untuk mengidentifikasi baris yang tidak cocok dengan filter boolean pada kolom tabel kanan, serta menghitung jumlah baris kiri yang tidak memiliki kecocokan—pemeriksaan kualitas data yang berguna.

result = pd.merge(orders, customers, on='customer_id', how='left')
print(result)
#    order_id  customer_id  amount   name
# 0         1          101     250  Alice
# 1         2          102      80    Bob
# 2         3          101     320  Alice
# 3         4          999     150    NaN  <- no matching customer

# Count unmatched
unmatched = result['name'].isna().sum()
print(f'{unmatched} orders have no customer record')

Kapan Menggunakan Left Join

Left join sesuai digunakan ketika DataFrame kiri adalah tabel utama dan tabel kanan berisi data tambahan. Skenario umum meliputi: memperkaya tabel fakta dengan tabel dimensi (pesanan + nama produk), menambahkan metadata opsional (pengguna + data profil), atau menghitung metrik untuk semua data meskipun pencarian gagal. Dalam sebagian besar kode analitik, left join jauh lebih umum daripada right join.

# Realistic pattern: enrich all products with optional category data
products = pd.DataFrame({'sku': ['A1', 'B2', 'C3'], 'price': [10, 20, 15]})
categories = pd.DataFrame({'sku': ['A1', 'C3'], 'category': ['Tools', 'Home']})

# Keep all products; add category where available
enriched = pd.merge(products, categories, on='sku', how='left')
print(enriched)
#    sku  price category
# 0   A1     10    Tools
# 1   B2     20      NaN
# 2   C3     15     Home

Right Join: Mempertahankan Semua Baris Kanan

right join (how='right') merupakan kebalikan dari left join: join ini mempertahankan setiap baris dari DataFrame kanan dan mengisi kolom tabel kiri dengan NaN jika tidak ada kecocokan. Right join lebih jarang digunakan karena Anda selalu dapat memperoleh hasil yang sama dengan menukar argumen DataFrame dan menggunakan left join, yang lebih jelas bagi pembaca.

# Right join: keep all customers, attach orders where they exist
result = pd.merge(orders, customers, on='customer_id', how='right')
print(result)
# All 3 customers appear; Carol (103) has NaN for order_id and amount

# Equivalent left join (swap arguments):
result2 = pd.merge(customers, orders, on='customer_id', how='left')
# Same data, just column order differs

Membandingkan Keempat Jenis Join

Keempat jenis join hanya berbeda dalam hal baris dari sisi yang tidak cocok mana yang dipertahankan. inner: hanya baris yang cocok. outer: semua baris dari kedua sisi. left: semua baris kiri. right: semua baris kanan. Untuk entri yang tidak cocok, kolom dari sisi yang tidak memiliki data diisi dengan NaN. Pemilihan yang tepat sangat penting untuk menghindari penghapusan atau penggandaan data secara diam-diam.

# Summary table
# how='inner'  : rows in BOTH tables
# how='left'   : ALL left rows  + matched right
# how='right'  : matched left   + ALL right rows
# how='outer'  : ALL left rows  + ALL right rows

# Test each
for how in ['inner', 'left', 'right', 'outer']:
    r = pd.merge(orders, customers, on='customer_id', how=how)
    print(f'{how}: {len(r)} rows')

Mengisi NaN dalam Hasil Left Join

Setelah left join, baris yang tidak cocok memiliki NaN di kolom tabel kanan. Anda biasanya ingin mengisinya dengan nilai bawaan yang sesuai—misalnya, 'Unknown' untuk kategori yang hilang atau 0 untuk jumlah yang hilang. Gunakan fillna() pada hasil, atau berikan fill_value dalam operasi aritmetika yang dilakukan setelah join.

result = pd.merge(products, categories, on='sku', how='left')
result['category'] = result['category'].fillna('Uncategorised')
print(result)
#    sku  price       category
# 0   A1     10          Tools
# 1   B2     20  Uncategorised
# 2   C3     15           Home

Left Anti-Join: Baris Tanpa Kecocokan

Pola berguna yang tidak didukung secara langsung oleh how adalah anti-join: hanya mempertahankan baris kiri yang TIDAK memiliki kecocokan di tabel kanan. Terapkan pola ini dengan left join menggunakan indicator=True, lalu lakukan filter untuk _merge == 'left_only'. Ini sangat cocok untuk menemukan data yatim, item baru yang tidak ada dalam daftar referensi, atau transaksi yang tidak tercatat dalam buku besar.

# Anti-join: orders with no matching customer record
result = pd.merge(orders, customers, on='customer_id',
                  how='left', indicator=True)
unmatched_orders = result[result['_merge'] == 'left_only'].drop(columns='_merge')
print(unmatched_orders)
#    order_id  customer_id  amount  name
# 3         4          999     150   NaN

Mempertahankan Jumlah Baris dengan Left Join

Jika DataFrame kanan memiliki kunci unik, left join dijamin mempertahankan jumlah baris yang persis sama dengan tabel kiri. Namun, jika tabel kanan memiliki nilai kunci duplikat, left join akan menggandakan baris seperti inner join. Selalu pastikan jumlah baris keluaran sama dengan jumlah baris tabel kiri ketika Anda mengharapkan hubungan satu-ke-banyak.

# Right table has duplicate keys -> row multiplication
orders_small = pd.DataFrame({'id': [1, 2], 'amount': [100, 200]})
multi_customer = pd.DataFrame({
    'id': [1, 1],  # duplicate!
    'contact': ['Alice', 'Alice2']
})

result = pd.merge(orders_small, multi_customer, on='id', how='left')
print(len(result))  # 3 rows! order 1 appears twice
print(result)

Pola Left Join di Dunia Nyata

Berikut alur kerja lengkap di dunia nyata: mulai dengan log transaksi, lakukan left join dengan katalog produk untuk mendapatkan nama, lalu lakukan left join dengan tabel pelanggan untuk mendapatkan nama. Isi pencarian yang hilang dengan nilai bawaan. Rangkaian left join memastikan setiap baris transaksi tetap dipertahankan meskipun data produk atau pelanggan tidak ada dalam tabel referensi.

transactions = pd.DataFrame({
    'txn_id': [1, 2, 3],
    'cust_id': [10, 11, 99],
    'prod_id': [20, 21, 20],
    'total': [50, 30, 70]
})

custs = pd.DataFrame({'cust_id': [10, 11], 'cust_name': ['Alice', 'Bob']})
prods = pd.DataFrame({'prod_id': [20, 21], 'prod_name': ['Widget', 'Gadget']})

result = (
    transactions
    .merge(custs, on='cust_id', how='left')
    .merge(prods, on='prod_id', how='left')
)
print(result)

Keputusan Left Join vs Inner Join

Pilihan antara left dan inner join merupakan keputusan logika bisnis: haruskah Anda mempertahankan data yang tidak memiliki kecocokan pencarian, atau menghapusnya secara diam-diam? Gunakan left join ketika pencarian yang tidak ditemukan masih dapat diterima dan Anda ingin mempertahankan semua data utama. Gunakan inner join ketika pencarian yang tidak ditemukan berarti data tersebut tidak valid dan harus dikeluarkan dari analisis. Selalu dokumentasikan pilihan Anda beserta alasannya.

# Left join: keep all transactions (some may have no product name)
result_left = pd.merge(transactions, prods, on='prod_id', how='left')
print('Left join rows:', len(result_left))   # same as transactions

# Inner join: only transactions with known product
result_inner = pd.merge(transactions, prods, on='prod_id', how='inner')
print('Inner join rows:', len(result_inner))  # may be fewer

Pemeriksaan Singkat

Uji pemahaman Anda tentang left dan right join dari pelajaran ini.

Rangkuman Pelajaran

Dalam pelajaran ini, Anda telah mempelajari: left join mempertahankan semua baris dari DataFrame kiri dan mengisi kolom kanan dengan NaN untuk data yang tidak cocok; right join merupakan kebalikannya; pola anti-join menggunakan indicator=True menemukan baris kiri yang tidak memiliki kecocokan di kanan; dan pilihan antara left dan inner join merupakan keputusan logika bisnis. Selanjutnya, kita akan mempelajari cara menggabungkan DataFrames berdasarkan indeksnya, bukan kolom.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Gabungan Kiri dan Kanan” gratis?

Ya — teks lengkap “Gabungan Kiri dan Kanan” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Pandas & NumPy Academy, upgrade ke CoddyKit PRO. Kursus Pandas & NumPy Academy mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Gabungan Kiri dan Kanan”?

Lakukan gabungan kiri dan kanan untuk mempertahankan semua baris dari satu tabel sambil mencocokkan rekaman dari tabel lain. Kamu berlatih Pandas & NumPy Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai Pandas & NumPy Academy?

Tidak diperlukan pengalaman sebelumnya. Pandas & NumPy Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 3 dari 4.

Berapa lama pelajaran “Gabungan Kiri dan Kanan” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran Pandas & NumPy Academy ini?

Ya. Setiap pelajaran Pandas & NumPy Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. pd.concat untuk Menumpuk DataFrames
  2. pd.merge: Gabungan Dalam dan Luar
  3. Gabungan Kiri dan Kanan
  4. Menggabungkan Berdasarkan Indeks
← Kembali ke Pandas & NumPy Academy