Chapter merge_asof sudah menunjukkan penggabungan dua tabel waktu dengan pencocokan terdekat, dan chapter ini melengkapinya dengan dua alat sekeluarga. Pertama, pd.merge_ordered() menggabungkan dua tabel pada kunci yang diurutkan bersama, lengkap dengan pengisian maju untuk lubang antar tanggal — bentuk yang paling alami untuk menggabungkan dua deret waktu dengan ritme berbeda. Kedua, anti-join yang baru masuk di pandas 3.0: pencocokan yang hasilnya justru baris tanpa pasangan, kebutuhan klasik untuk menemukan stok tanpa transaksi atau pelanggan tanpa pesanan. Chapter ini membahas keduanya beserta aturan pengisiannya.

merge_ordered() untuk Deret Waktu #

pd.merge_ordered(kiri, kanan, on="tanggal", fill_method="ffill") menggabungkan dua tabel pada gabungan kunci yang terurut naik. Kunci hasil adalah gabungan semua tanggal kedua tabel, sehingga 2026-02 yang hanya ada di tabel permintaan tetap muncul. Parameter fill_method="ffill" mengisi lubang nilai dengan angka terakhir yang diketahui di atasnya: beras bulan Februari mewarisi 12_500 dari Januari, dan begitu seterusnya sampai nilai baru muncul. Tanpa fill_method, hasil yang sama tampil dengan NaN di lubangnya, siap diisi strategi lain seperti interpolate() dari section Missing Data.

python
import pandas as pd

harga = pd.DataFrame(
    {
        "tanggal": ["2026-01", "2026-03", "2026-04"],
        "beras": [12_500, 12_900, 13_100],
    }
)
permintaan = pd.DataFrame(
    {
        "tanggal": ["2026-02", "2026-03"],
        "permintaan": [810, 845],
    }
)

# merge_ordered: kunci digabung terurut, lubang diisi maju
gabungan = pd.merge_ordered(harga, permintaan, on="tanggal", fill_method="ffill")
print(gabungan)

# anti-join (pandas 3.0): baris kiri yang TIDAK punya pasangan di kanan
stok = pd.DataFrame({"kode": ["P-1", "P-2", "P-3"], "stok": [12, 7, 30]})
terjual = pd.DataFrame({"kode": ["P-2", "P-3", "P-9"]})
tanpa_pasangan = stok.merge(terjual, on="kode", how="left_anti")
print("\nproduk stok tanpa transaksi terjual:")
print(tanpa_pasangan)

Output yang Dihasilkan:

text
   tanggal  beras  permintaan
0  2026-01  12500         NaN
1  2026-02  12500       810.0
2  2026-03  12900       845.0
3  2026-04  13100       845.0

produk stok tanpa transaksi terjual:
  kode  stok
0  P-1    12

Mari kita telaah baris-baris kuncinya:

  1. Baris 17-18: merge_ordered menghasilkan empat baris untuk empat tanggal gabungan, terurut naik tanpa perlu sort_values() sesudahnya.
  2. Baris 17 (fill_method="ffill"): kolom beras terisi pada 2026-02, dan kolom permintaan menyeret nilai 845 ke 2026-04.
  3. Baris 21-25: stok.merge(terjual, on="kode", how="left_anti") menghasilkan satu baris — P-1, satu-satunya stok yang tidak muncul di tabel penjualan.

Anti-Join di pandas 3.0 #

Anti-join menjawab pertanyaan “siapa yang tidak ikut”: baris kiri yang kuncinya tidak ditemukan di tabel kanan. Sebelum pandas 3.0, pola ini ditulis dengan indicator=True pada how="left" diikuti filter _merge == "left_only", tiga langkah yang kini dipadatkan menjadi how="left_anti". Kebalikannya, how="right_anti", mengembalikan baris kanan tanpa pasangan kiri — misalnya kode penjualan P-9 yang tidak ada di master stok. Hasil anti-join tidak memuat kolom dari tabel pasangan karena memang tidak ada nilai yang cocok untuk dibawa.

Kapan Memilih yang Mana #

Tabel bantu kecilnya begini: merge untuk pencocokan kunci umum, merge_asof untuk pencocokan waktu terdekat toleran jeda, dan merge_ordered untuk union terurut dengan pengisian antar periode. Anti-join bukan saingan ketiganya melainkan pelengkap arah — ketiga method lain menanyakan baris yang cocok, anti-join menanyakan yang tidak cocok. Bila kebutuhannya memadukan dua deret dengan ritme berbeda dan lubang harus terisi, merge_ordered dengan fill_method="ffill" sering menggantikan rangkaian merge plus reindex plus ffill yang lebih panjang. Kombinasi by= juga tersedia pada kedua method waktu, sehingga penggabungan bisa dilakukan per grup seperti per toko.

Chapter berikutnya melanjutkan ke bentuk penyajian: pivot() dan pivot_table() yang memutar baris panjang menjadi tabel silang siap laporan.

Dokumentasi resmi yang relevan: pandas.merge_ordered untuk parameter fill_method dan by, pandas.DataFrame.merge untuk daftar nilai how termasuk anti-join, dan What’s new in pandas 3.0.0 yang mencatat tambahan anti-join.