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.
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:
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 12Mari kita telaah baris-baris kuncinya:
- Baris 17-18:
merge_orderedmenghasilkan empat baris untuk empat tanggal gabungan, terurut naik tanpa perlusort_values()sesudahnya. - Baris 17 (
fill_method="ffill"): kolomberasterisi pada2026-02, dan kolompermintaanmenyeret nilai845ke2026-04. - 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.