Setelah peta kekosongan di tangan, jalur pembersihan pertama adalah menghapus: baris yang kehilangan data kritis dilepaskan dari analisis. dropna() adalah alat pandas untuk pekerjaan ini, tetapi pemakaiannya menuntut kehati-hatian karena setiap baris yang dibuang adalah informasi yang tidak kembali. Chapter ini membedah perilaku bawaan dropna(), parameter how dan subset yang mengendalikan cakupannya, serta pola penulisan yang benar di era Copy-on-Write. Dataset pesanan yang sama tetap menjadi bahan latihan kita.
Perilaku Bawaan dropna() #
Tanpa parameter apa pun, dropna() membuang setiap baris yang memuat minimal satu sel kosong; perilaku ini setara dengan how="any" seperti didokumentasikan pada halaman pandas.DataFrame.dropna
. Method tersebut tidak mengubah pesanan; yang dikembalikan adalah DataFrame baru hasil penyaringan. Ukuran hasil langsung memberi tahu kita harga yang harus dibayar:
import pandas as pd
pesanan = pd.DataFrame(
{
"id_pesanan": [
"PSC-101", "PSC-102", "PSC-103", "PSC-104", "PSC-105",
"PSC-106", "PSC-101", "PSC-102", "PSC-103", "PSC-107",
],
"nama_pelanggan": [
"Budi", "Siti", "Dewi", "Andi", "Rina",
"Tono", "Budi", "Siti", "Dewi", "Sari",
],
"kota": [
"Jakarta", "Bandung", "Surabaya", "JAKARTA", "Bandung",
None, "Jakarta", "Bandung", "Surabaya", "Medan",
],
"umur": [29, 34, None, 41, 27, 38, 29, 34, None, 45],
"total_belanja": [
250000, 480000, 150000, None, 320000,
275000, 250000, 480000, 165000, 190000,
],
}
)
print("Ukuran awal :", pesanan.shape)
print("dropna() :", pesanan.dropna().shape)
print("dropna(how='all') :", pesanan.dropna(how="all").shape)
print("dropna(subset=['kota']) :", pesanan.dropna(subset=["kota"]).shape)
print()
bersih = pesanan.dropna(subset=["umur", "total_belanja"])
print(bersih)
print()
print("pesanan tetap utuh :", pesanan.shape)Output yang Dihasilkan:
Ukuran awal : (10, 5)
dropna() : (6, 5)
dropna(how='all') : (10, 5)
dropna(subset=['kota']) : (9, 5)
id_pesanan nama_pelanggan kota umur total_belanja
0 PSC-101 Budi Jakarta 29.0 250000.0
1 PSC-102 Siti Bandung 34.0 480000.0
4 PSC-105 Rina Bandung 27.0 320000.0
5 PSC-106 Tono NaN 38.0 275000.0
6 PSC-101 Budi Jakarta 29.0 250000.0
7 PSC-102 Siti Bandung 34.0 480000.0
9 PSC-107 Sari Medan 45.0 190000.0
pesanan tetap utuh : (10, 5)Mari kita telaah peran setiap bagian skrip di atas:
- Baris 25-28: empat pemanggilan dengan cakupan berbeda.
dropna()menghasilkan 6 baris karena 4 baris data punya minimal satu sel kosong;how="all"tetap 10 baris karena tidak ada baris yang seluruhnya kosong;subset=["kota"]menghasilkan 9 baris karena hanya PSC-106 yang kotanya kosong. - Baris 30-31 (
bersih = pesanan.dropna(subset=["umur", "total_belanja"])): pemeriksaan hanya pada dua kolom kritis sehingga 7 baris lolos; PSC-106 tetap dipertahankan karenaumurdantotal_belanja-nya terisi. - Baris 33 (
print("pesanan tetap utuh ...")): bukti bahwadropna()mengembalikan salinan;pesananmasih berisi 10 baris.
Parameter yang Mengendalikan Cakupan #
| Parameter | Nilai | Efek |
|---|---|---|
how | "any" (bawaan) | Baris dibuang bila ada satu saja sel kosong |
how | "all" | Baris dibuang hanya bila semua selnya kosong |
subset | List kolom, mis. ["umur"] | Pemeriksaan hanya pada kolom yang disebut |
axis | 0 (bawaan) atau 1 | Menghapus baris atau kolom yang mengandung sel kosong |
thresh | Bilangan bulat, mis. 5 | Baris dipertahankan bila terisi minimal 5 sel; pada data kita menyisakan 6 baris |
Pilih subset setiap kali kolom kunci analisis sudah jelas; menghapus baris hanya karena satu kolom pelengkap kosong sering kali pemborosan. Parameter axis=1 membuang kolom alih-alih baris; pada dataset pesanan, pesanan.dropna(axis=1) menyisakan hanya dua kolom id_pesanan dan nama_pelanggan, peringatan bahwa kolom dengan banyak kekosongan sebaiknya diisi, bukan dibuang. Parameter thresh menawarkan jalan tengah: baris yang masih cukup terisi dipertahankan meskipun tidak sempurna.
Pola Assignment di Era Copy-on-Write #
Karena dropna() selalu mengembalikan objek baru, cara resmi menerapkan hasilnya adalah penugasan kembali: pesanan = pesanan.dropna(subset=["umur"]). Pola ini bukan gaya lama yang berlebihan; sejak pandas 3.0 dengan Copy-on-Write
yang selalu aktif, parameter inplace memang masih tersedia tetapi tidak lagi disarankan, dan penugasan ulang membuat alur data terbaca dari kiri ke kanan. Bila baris yang dibuang perlu ditelaah lebih dulu, kebalikannya tersedia: pesanan[pesanan["umur"].isna()] menampilkan baris-baris itu tanpa menghapus apa pun.
Menghapus cepat dan tegas, tetapi selalu berbayang kehilangan informasi; seluruh rincian kedua jalur ini dirangkum pada panduan Working with missing data
. Jalur kedua, yaitu mengisi kekosongan dengan nilai pengganti yang masuk akal, sering lebih adil bagi data berukuran kecil. Chapter Mengisi Nilai Kosong membahas fillna(), ffill(), dan bfill(), tiga alat pengisi yang wajib kita kuasai.