Pandas dropna: Menghapus Data Kosong dengan Aman (2026)
TL;DR
Pandas dropna() ngehapus baris atau kolom yang punya nilai kosong (NaN). Secara default dia buang baris yang punya minimal satu sel kosong, yang sering kelewat agresif. Pakai subset biar cuma cek kolom penting, how='all' biar cuma buang yang kosong semua, dan thresh biar atur minimal berapa sel terisi. Selalu cek jumlah baris sebelum dan sesudah, biar tau berapa data yang kebuang.
Pandas dropna() ngehapus baris atau kolom yang punya nilai kosong (NaN). Satu baris kode, dan data bolong hilang.
Masalahnya, dropna() tanpa argumen ngebuang tiap baris yang punya minimal satu sel kosong. Kalau datamu punya banyak kolom, ini bisa ngehapus separuh data cuma gara-gara satu kolom yang jarang keisi.
Di tutorial ini kamu bakal belajar pakai dropna dengan aman: pilih baris atau kolom, tentuin kolom mana yang penting, dan atur berapa sel minimal yang harus terisi.
Apa itu dropna di pandas?
dropna() adalah method DataFrame yang ngebuang baris atau kolom berdasarkan nilai kosong. Di pandas, sel kosong direpresentasikan sebagai NaN. Secara default dropna ngecek tiap baris, dan kalau ada satu aja NaN, seluruh baris itu dibuang. Hasilnya DataFrame baru tanpa data bolong di kolom yang kamu tentuin.
Konsep NaN ini mirip NULL di database. Bedanya cara nanganinnya di Python.
Gimana cara pakai dropna dasar?
Mulai dari cek dulu ada berapa data kosong per kolom. Jangan langsung buang.
import pandas as pd
df = pd.read_csv('toko_berkah.csv')
# Cek jumlah NaN per kolom
print(df.isna().sum())
# Baru buang baris yang ada NaN-nya
df_bersih = df.dropna()
print(len(df), '->', len(df_bersih))
Baris terakhir itu pengaman. Selalu bandingin jumlah baris sebelum dan sesudah, biar kamu tau persis berapa data yang kebuang. Kalau turun dari 8.400 jadi 3.100, ada yang salah.
Gimana cara cuma buang baris berdasarkan kolom tertentu?
Ini yang paling sering kamu butuhin. Pakai subset biar dropna cuma ngecek kolom yang beneran penting.
# Cuma buang baris kalau kolom 'total' kosong
df_bersih = df.dropna(subset=['total'])
# Bisa beberapa kolom sekaligus
df_bersih = df.dropna(subset=['total', 'tanggal'])
Kolom ongkir yang sering kosong gak bikin baris kebuang, soalnya gak masuk subset. Cuma baris tanpa total atau tanggal yang dihapus. Ini jauh lebih aman dari dropna polos.
Apa fungsi argumen how dan thresh?
Dua argumen ini ngatur seberapa galak dropna-nya.
| Argumen | Efek |
|---|---|
how='any' | Buang baris kalau ada minimal satu NaN (default) |
how='all' | Buang baris cuma kalau semua selnya NaN |
thresh=3 | Simpan baris kalau minimal 3 sel terisi |
# Cuma buang baris yang benar-benar kosong total
df_bersih = df.dropna(how='all')
# Simpan baris kalau minimal 4 kolom terisi
df_bersih = df.dropna(thresh=4)
thresh berguna buat data survei atau sensor yang sebagian bolong tapi masih layak dipakai. Baris dengan 4 dari 5 kolom terisi masih kesimpan.
Gimana cara buang kolom, bukan baris?
Ganti axis ke 1. Ini buat ngebuang kolom yang kebanyakan kosong sampai gak berguna.
# Buang kolom yang punya NaN
df_bersih = df.dropna(axis=1)
# Buang kolom cuma kalau lebih dari separuh kosong
batas = len(df) * 0.5
df_bersih = df.dropna(axis=1, thresh=batas)
Hati-hati sama axis=1 polos. Dia ngebuang kolom apa pun yang punya satu NaN aja. Kolom penting bisa ikut hilang. Pakai thresh biar cuma kolom yang kebanyakan bolong yang kebuang.
Contoh kasus: bersihin data toko_berkah
Dataset toko_berkah punya Ngulik Data isinya 8.400 transaksi warung kelontong di Semarang. Lima kolom: tanggal, kota, kategori, total, ongkir.
Kolom ongkir kosong di 3.120 baris, soalnya banyak pelanggan ambil sendiri di toko. Kalau aku pakai dropna polos:
df.dropna() # sisa 5.280 baris
df.dropna(subset=['total']) # sisa 8.386 baris
Dropna polos ngebuang 3.120 baris, 37% dari data, cuma gara-gara ongkir kosong. Padahal transaksi itu valid, cuma gak ada ongkirnya.
Versi subset=['total'] cuma buang 14 baris yang total-nya beneran hilang. Selisihnya 3.106 baris yang keselametan. Itu beda antara analisa yang bener sama analisa yang misleading gara-gara sepertiga data raib diam-diam.
Kesalahan umum waktu pakai dropna
Pakai dropna polos di data multi-kolom. Ini kesalahan nomor satu. Satu kolom yang jarang keisi bisa ngebuang ribuan baris valid. Selalu pikirin subset dulu.
Lupa hasilnya DataFrame baru. df.dropna() gak ngubah df aslinya. Kamu harus simpan ke variabel: df = df.dropna(...). Kalau lupa, kamu kira udah bersih padahal belum.
Gak bedain kosong sama nol. Ongkir NaN artinya "gak ada ongkir", bukan "nol". Kadang yang bener bukan dibuang, tapi diisi. Buat itu pakai pandas fillna.
Gak cek dulu berapa yang kebuang. Selalu print len(df) sebelum dan sesudah. Angka yang turun drastis itu tanda bahaya.
String kosong dikira NaN. Sel berisi teks kosong "" gak dianggap NaN sama dropna. Ganti dulu pakai df.replace('', pd.NA) kalau perlu.
FAQ
Apa bedanya dropna sama fillna?
dropna ngebuang baris atau kolom yang punya nilai kosong. fillna ngisi nilai kosong itu dengan sesuatu, misalnya nol, rata-rata, atau teks tertentu. Pakai dropna kalau data kosong bikin baris gak berguna. Pakai fillna kalau kosong itu punya arti yang bisa diisi, misalnya ongkir kosong berarti nol. Sering keduanya dipakai bareng di kolom yang beda.
Apakah dropna mengubah DataFrame asli?
Nggak secara default. dropna ngembaliin DataFrame baru dan ninggalin yang asli utuh. Buat nyimpen hasilnya, kamu harus assign ke variabel, misalnya df = df.dropna(). Versi lama pandas punya argumen inplace=True buat ngubah langsung, tapi cara yang lebih disaranin sekarang adalah assign ulang. Ini bikin kode lebih gampang dibaca dan aman dari efek samping.
Gimana cara tau berapa data kosong sebelum dibuang?
Pakai df.isna().sum() buat ngitung NaN per kolom, dan df.isna().sum().sum() buat total keseluruhan. Buat lihat persennya, bagi sama len(df). Cek ini dulu sebelum dropna, biar kamu tau kolom mana yang paling banyak bolong dan mutusin apakah harus dibuang atau diisi. Membuang tanpa ngecek itu resep buat kehilangan data diam-diam.
Apa yang dilakukan argumen thresh?
thresh nentuin minimal berapa sel terisi biar baris atau kolom kesimpen. Misalnya thresh=3 di dropna baris berarti baris disimpan kalau minimal 3 kolomnya terisi, sisanya boleh NaN. Ini berguna buat data yang sebagian bolong tapi masih layak dipakai, kayak survei yang gak semua pertanyaan dijawab. Beda dari how yang cuma punya dua pilihan any atau all.
Kenapa string kosong gak kehapus dropna?
Soalnya string kosong "" itu nilai yang valid di mata pandas, bukan NaN. dropna cuma ngecek NaN, bukan teks kosong. Kalau data kamu punya sel berisi "" yang sebenernya harusnya dianggap kosong, ganti dulu pakai df.replace('', pd.NA) atau df.replace('', float('nan')), baru jalanin dropna. Tanpa langkah ini, baris dengan teks kosong bakal lolos.
Penutup
dropna gampang dipakai, tapi versi polosnya berbahaya di data multi-kolom. Satu kolom yang jarang keisi bisa ngebuang ribuan baris valid.
Aturan amannya: cek dulu pakai isna().sum(), pakai subset buat kolom penting, dan selalu bandingin jumlah baris sebelum dan sesudah.
Semua argumen dropna ada di dokumentasi resmi pandas.
Kalau data kosong itu sebenernya punya arti dan harusnya diisi, lanjut ke pandas fillna. Dan buat gabungin beberapa file sebelum dibersihin, cek pandas merge. Konsep bersih-bersih data ini bagian dari data wrangling.
Mau praktek langsung? Mulai latihan SQL gratis
Latihan interaktif, langsung di browser.
Artikel terkait
NumPy reshape: Ubah Bentuk Array (2026)
Fungsi reshape di NumPy ngatur ulang bentuk array tanpa ngubah datanya. Ini cara pakainya, arti angka -1, dan cara ngeflat array.
NumPy Array: Dasar-Dasar untuk Analis Data (2026)
NumPy array bikin hitungan data di Python jauh lebih cepat dari list biasa. Ini dasar bikin, slicing, dan operasi array buat analis.
Alternatif iterrows yang Lebih Cepat di Pandas
iterrows nyaman ditulis tapi lambat. Ini urutan alternatif iterrows di pandas dari yang tercepat, plus benchmark biar kamu tau kapan pakai yang mana.