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.
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.
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.
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.
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 kesimpen.
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.
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.
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.
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.
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.
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.
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.
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.
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.
Nama toko ketik campur huruf besar-kecil, spasi nyasar di ujung, atau kode produk nempel jadi satu. Accessor .str di pandas ngerapiin semua itu tanpa loop.
Model machine learning cuma ngerti angka, bukan teks kayak merah atau biru. get_dummies ngubah kolom kategori jadi kolom 0/1 dalam satu baris kode.
Cara pakai pandas crosstab buat bikin tabel silang yang menghitung frekuensi antar dua kategori. Contoh analisis kategori produk per kota UMKM.