Jawaban analisis hampir selalu tersebar di lebih dari satu sumber, dan
penggabungannya adalah titik yang paling sering menggandakan baris diam-diam.
Topik ini menetapkan disiplin merge pada pandas, mulai dari kebersihan
kunci, pemilihan jenis join, pemeriksaan kardinalitas dengan validate,
sampai audit baris yang tidak mendapat pasangan. Setelah membacanya, data
pengukuran dan metadata stasiun pada dataset latihan ini dapat digabungkan
dengan bukti bahwa jumlah barisnya tetap benar.
Kunci yang bersih mendahului join#
Merge memasangkan baris dengan membandingkan nilai kunci, sehingga kunci yang kotor memasangkan baris dengan pasangan yang salah atau tidak memasangkan sama sekali. Pembersihan kunci pada kedua sisi mendahului merge, dan pada dataset latihan ini berarti menyeragamkan nama stasiun terlebih dahulu, sebagaimana dikerjakan pada topik teks dan tanggal.
Pemeriksaan minimum yang murah adalah unique() pada kunci kedua sisi serta
dtypes-nya, karena kunci berupa teks yang dibandingkan dengan kunci berupa
angka menghasilkan join kosong tanpa error apa pun. Kunci dengan spasi
menempel adalah bentuk yang paling sering lolos, dan .str.strip() pada
kedua sisi menutupnya.
Keunikan kunci juga diperiksa sebelum join. Tabel metadata yang kuncinya tidak
unik memasangkan setiap baris data dengan lebih dari satu pasangan, dan
jumlah baris hasilnya membengkak tanpa peringatan, sehingga pemeriksaan
duplicated() pada tabel kunci menjadi kebiasaan sebelum merge.
Jenis join dan yang dipilih secara bawaan#
Empat jenis join menjawab empat pertanyaan berbeda, dan tabel berikut merangkumnya.
| Jenis | Baris yang dipertahankan | Pemakaian khas |
|---|---|---|
| inner | yang punya pasangan di kedua sisi | analisis yang butuh kedua sisi lengkap |
| left | seluruh baris kiri | menempel metadata pada data utama |
| right | seluruh baris kanan | jarang dipakai, ditulis ulang sebagai left |
| outer | semua baris kedua sisi | audit selisih antar sumber |
Pilihan bawaan yang sehat untuk pekerjaan analisis adalah how="left" pada
tabel data utama, karena pengukuran yang metadata-nya tidak ditemukan tetap
tampil dengan kolom metadata kosong, dan kekosongan itu terlihat alih-alih
menghilang sebagaimana pada inner join. Skrip berikut menggabungkan
pengukuran dengan metadata stasiun, dengan pemeriksaan kardinalitas
validate="m:1" yang menegaskan setiap nama stasiun unik di sisi metadata.
"""Penggabungan dua sumber dengan merge: kunci bersih, jenis join, dan pemeriksaan."""
import pandas as pd
data = pd.read_csv(
"ukuran_udara.csv",
na_values=["kosong", "-999.0"],
dtype={"pm25": "string", "kelembapan": "string"},
)
data["pm25"] = data["pm25"].astype("float")
data["stasiun"] = (
data["stasiun"].str.strip().str.replace(r"\s+", " ", regex=True).str.title()
)
stasiun = pd.read_csv("stasiun.csv")
gabung = data.merge(
stasiun, left_on="stasiun", right_on="nama", how="left", validate="m:1"
)
print(int(gabung["wilayah"].isna().sum()), "baris tanpa pasangan metadata")
print(gabung[["stasiun", "wilayah", "tahun_operasi"]].head(3).to_string(index=False))
print()
dipakai = set(data["stasiun"])
tanpa_ukur = [n for n in stasiun["nama"] if n not in dipakai]
print("stasiun pada metadata tanpa pengukuran:", tanpa_ukur)0 baris tanpa pasangan metadata
stasiun wilayah tahun_operasi
Stasiun A Kawasan Sekolah 2019
Stasiun A Kawasan Sekolah 2019
Stasiun A Kawasan Sekolah 2019
stasiun pada metadata tanpa pengukuran: ['Stasiun C', 'Stasiun D']Argumen validate="m:1" adalah pengaman yang paling sering menyelamatkan
hasil, yaitu ia menghentikan merge dengan error apabila kunci di sisi kanan
ternyata tidak unik, keadaan yang tanpa pengaman menggandakan baris data
diam-diam. Kolom nama pada metadata berdampingan dengan kolom stasiun
pada data, dan salah satu di antaranya dihapus setelah pemeriksaan bila
hasilnya dipakai lebih lanjut.
Mengaudit baris tanpa pasangan#
Setiap join meninggalkan dua pertanyaan yang wajib dijawab, yaitu baris kiri
mana yang tidak mendapat pasangan dan baris kanan mana yang tidak dipakai.
Pertanyaan pertama dijawab dengan menghitung isna() pada kolom hasil join,
yang pada keluaran di atas bernilai nol karena kedua stasiun data terdapat
pada metadata.
Pertanyaan kedua adalah anti-join, yaitu mencari baris kanan yang tidak muncul di kiri, dan pada dataset ini metadatanya memuat Stasiun C dan D yang tidak memiliki pengukuran. Temuan itu bukan kesalahan, melainkan informasi yang harus diputuskan, misalnya metadata tersebut diperlukan untuk laporan ketersediaan alat, atau justru ditandai bahwa sumber datanya belum lengkap.
Pola audit yang paling eksplisit adalah merge dengan argumen
indicator=True, yang menambahkan kolom merge berisi both, left_only,
atau right_only untuk setiap baris, dan value_counts() pada kolom itu
memberikan laporan lengkap dalam satu baris. Pola inilah yang dipakai ulang
setiap kali kedua sumber berpotensi tidak selaras.
Kesalahan umum#
Kesalahan pertama adalah merge tanpa validate, sehingga kunci kanan yang
tidak unik menggandakan baris dan seluruh statistik turunnya ikut dobel.
Jumlah baris sebelum dan sesudah merge selalu dibandingkan, dan validate
membuat pemeriksaan itu otomatis.
Kesalahan kedua adalah memilih inner join karena hasilnya tampak bersih. Baris yang hilang pasangannya menghilang tanpa jejak, dan kehilangan itu baru ketahuan saat laporan tidak cocok dengan sumber lainnya. Left join dengan audit kekosongan mempertahankan kejujuran jumlah baris.
Kesalahan ketiga adalah menggabungkan pada kunci yang belum diseragamkan, dan
gejalanya adalah join yang kosong atau sebagian kosong. Pembersihan teks pada
kedua sisi kunci, dilanjutkan unique() untuk membandingkan daftarnya,
adalah pemeriksaan sepuluh detik yang mencegahnya.
Ringkasan#
- Kunci dibersihkan dan diuji keunikannya pada kedua sisi sebelum merge, termasuk spasi menempel dan perbedaan tipe.
how="left"pada tabel data utama mempertahankan baris yang metadata-nya kosong, sehingga kekosongan tetap terlihat.validate="m:1"menghentikan merge yang akan menggandakan baris, dan audit baris tanpa pasangan dilakukan denganisna()maupunindicator=True.- Anti-join menghasilkan informasi yang diputuskan dan dicatat, bukan kesalahan yang disembunyikan.
Referensi#
- Merge, join, concatenate and compare — pandas documentation
—
dokumentasi resmi
merge, jenis join, danvalidate. - pandas.DataFrame.merge — pandas documentation
—
rujukan parameter lengkap termasuk
indicatordansuffixes.