Penghapusan adalah strategi pembersihan yang membuang baris atau kolom yang memuat data hilang, dan dropna adalah metode pandas untuk melakukannya. Topik ini membahas perilaku dropna() default, parameter subset, how, dan thresh, pembuangan kolom melalui axis=1, serta konsekuensi penghapusan terhadap jumlah baris dan distribusi data. Dataset yang dipakai tetap log sensor versi kotor dengan NaN pada kolom suhu_c dan lembap_pct. Setelah topik ini dipraktikkan, setiap pemanggilan dropna dapat disertai alasan yang jelas karena banyaknya baris yang hilang dan pergeseran statistiknya diketahui sebelum analisis dilanjutkan.
Bentuk default yang membuang setiap baris ber-NaN#
dropna() tanpa parameter membuang setiap baris yang memuat minimal satu NaN, dan perilaku ini sama dengan menyebut how="any" secara eksplisit. Pada dataset kontrak yang berisi 99 baris, pemanggilan tersebut menyisakan 90 baris, sehingga 9 baris hilang karena NaN pada suhu_c atau lembap_pct atau keduanya. Baris yang dibuang tidak diumumkan satu per satu, sehingga pergeseran ukuran tabel hanya terlihat bila jumlah barisnya diperiksa. Jalankan skrip berikut dan bandingkan setiap angka dengan baris awalnya.
import numpy as np
import pandas as pd
# Dataset kontrak versi kotor: log sensor tiga ruangan dengan NaN dan duplikat.
rng = np.random.default_rng(42)
n = 96
df = pd.DataFrame({
"waktu": pd.date_range("2026-01-05 07:00", periods=n, freq="15min"),
"ruang": rng.choice(["Lab A", "Lab B", "Ruang Arsip"], n, p=[0.4, 0.35, 0.25]),
"suhu_c": np.round(rng.normal(24, 1.5, n), 1),
"lembap_pct": np.round(rng.normal(60, 5, n), 1),
"status_sensor": rng.choice(["normal", "kalibrasi", "rusak"], n, p=[0.85, 0.10, 0.05]),
})
df.loc[rng.random(n) < 0.05, "suhu_c"] = np.nan
df.loc[rng.random(n) < 0.05, "lembap_pct"] = np.nan
df = pd.concat([df, df.sample(3, random_state=42)], ignore_index=True)
print("baris awal :", len(df))
print("dropna() apa saja :", len(df.dropna()))
print("how=\"all\" :", len(df.dropna(how="all")))
print("subset suhu_c :", len(df.dropna(subset=["suhu_c"])))
print("thresh=5 :", len(df.dropna(thresh=5)))
print("thresh=4 :", len(df.dropna(thresh=4)))
print("kolom tersisa axis=1 :", df.dropna(axis=1).columns.tolist())
print("rata-rata suhu awal :", df["suhu_c"].mean().round(3))
print("rata-rata setelah dropna :", df.dropna()["suhu_c"].mean().round(3))# menjalankan skrip penerapan dropna
python3 penerapan_dropna.pybaris awal : 99
dropna() apa saja : 90
how="all" : 99
subset suhu_c : 92
thresh=5 : 90
thresh=4 : 98
kolom tersisa axis=1 : ['waktu', 'ruang', 'status_sensor']
rata-rata suhu awal : 23.91
rata-rata setelah dropna : 23.882Nilai how="all" memberikan kontras yang jelas karena parameter itu hanya membuang baris yang seluruh kolomnya NaN, dan dataset ini tidak memuat satu baris pun seperti itu sehingga angkanya tetap 99. Dengan demikian 9 baris yang terbuang oleh default semuanya adalah baris yang hilang sebagian, dan pada baris-baris itu kolom waktu, ruang, serta status_sensor masih bernilai dan masih bisa berguna.
Parameter subset, how, dan thresh#
Parameter subset mempersempit penilaian ke kolom tertentu, sehingga NaN pada kolom lain tidak lagi menyebabkan baris dibuang. Pemanggilan dropna(subset=["suhu_c"]) menghasilkan 92 baris karena hanya 7 baris yang suhu_c-nya NaN, dan baris dengan lembap_pct NaN tetap dipertahankan. Parameter ini dipakai ketika analisis hanya menyangkut kolom tertentu, misalnya perhitungan suhu yang tidak memerlukan kelembapan sama sekali.
Parameter thresh menetapkan ambang minimum banyaknya nilai terisi yang harus dimiliki sebuah baris agar dipertahankan. Pemanggilan dropna(thresh=5) menuntut kelima kolom terisi sehingga hasilnya 90 baris, persis sama dengan default pada dataset ini. Sebaliknya dropna(thresh=4) membolehkan satu kehilangan per baris dan menyisakan 98 baris, yaitu hanya dua baris yang suhu_c dan lembap_pct-nya sama-sama NaN yang terbuang. Dengan menaikkan atau menurunkan ambang tersebut, ketelitian pembuangan dapat diatur mulai dari yang paling longgar sampai yang paling ketat.
Membuang kolom dengan axis=1#
Parameter axis=1 membalik arah kerja dropna dari baris menjadi kolom, sehingga yang dinilai adalah kolom yang memuat NaN. Pada dataset ini df.dropna(axis=1) menyisakan hanya tiga kolom, yaitu waktu, ruang, dan status_sensor, karena suhu_c dan lembap_pct masing-masing memuat NaN dan keduanya terbuang seluruhnya. Dua kolom pengukuran hilang sekaligus hanya karena beberapa selnya kosong, dan itu jelas berlebihan untuk dataset ini. Pola axis=1 yang sehat adalah pembuangan kolom yang mayoritas isinya kosong atau kolom yang memang tidak akan dipakai, dan pada kasus semacam itu dropna(axis=1, thresh=...) memberi kontrol yang sama seperti pada baris.
Konsekuensi terhadap jumlah baris dan distribusi#
Konsekuensi pertama penghapusan adalah berkurangnya ukuran sampel, dan angkanya terlihat langsung pada keluaran skrip yaitu 99 menjadi 90. Konsekuensi kedua lebih halus, yaitu pergeseran distribusi karena baris yang dibuang bukan sampel acak yang netral. Rata-rata suhu_c bergeser dari 23.91 menjadi 23.882, dan pergeseran sekecil itu terjadi karena kehilangan pada dataset ini memang tidak mengarah pada suhu tertentu. Apabila kehilangan terkonsentrasi pada kondisi tertentu, misalnya hanya terjadi saat suhu ekstrem, pergeseran yang muncul bisa jauh lebih besar dan kesimpulan analisis ikut berubah. Karena itu keputusan menghapus perlu dicatat sebagai bagian dari proses analisis, bukan sekadar langkah teknis yang dilewati.
Kesalahan umum#
Kesalahan yang paling sering pada thresh adalah menafsirkannya terbalik, yaitu mengira nilai itu adalah ambang banyaknya NaN yang ditoleransi, sedangkan maknanya adalah ambang minimum nilai terisi. Pembaca yang menghendaki pembuangan baris dengan lebih dari dua kehilangan lalu memanggil dropna(thresh=3) justru tidak membuang apa pun pada dataset ini, karena semua baris memiliki minimal tiga nilai terisi dan hasilnya tetap 99 baris. Kesalahan semacam ini tidak memunculkan error apa pun sehingga hanya terdeteksi bila jumlah barisnya diverifikasi. Kebiasaan yang mencegahnya adalah mencetak len sebelum dan sesudah setiap dropna, kemudian memastikan selisihnya sesuai perhitungan yang diharapkan dari profil isna().sum() pada topik Deteksi Data Hilang.
Ringkasan#
dropna()default membuang setiap baris yang memuat minimal satu NaN, danhow="all"mempersempitnya ke baris yang NaN penuh.subsetmenentukan kolom yang dinilai,threshmenetapkan minimum nilai terisi per baris, danaxis=1membalik arah ke pembuangan kolom.- Penghapusan mengecilkan sampel dan dapat menggeser statistik, sehingga
lensebelum-sesudah beserta rata-rata perlu dibandingkan. - Salah tafsir
threshtidak memunculkan error, sehingga verifikasi angka baris adalah satu-satunya pengaman.
Referensi#
- pandas.DataFrame.dropna — pandas
— Dokumentasi metode
dropnabeserta parameteraxis,how,thresh, dansubset. - Working with missing data — pandas — Panduan resmi pandas yang membahas penghapusan data hilang sebagai satu opsi penanganan.