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:

python
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:

text
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:

  1. 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.
  2. Baris 30-31 (bersih = pesanan.dropna(subset=["umur", "total_belanja"])): pemeriksaan hanya pada dua kolom kritis sehingga 7 baris lolos; PSC-106 tetap dipertahankan karena umur dan total_belanja-nya terisi.
  3. Baris 33 (print("pesanan tetap utuh ...")): bukti bahwa dropna() mengembalikan salinan; pesanan masih berisi 10 baris.

Parameter yang Mengendalikan Cakupan #

ParameterNilaiEfek
how"any" (bawaan)Baris dibuang bila ada satu saja sel kosong
how"all"Baris dibuang hanya bila semua selnya kosong
subsetList kolom, mis. ["umur"]Pemeriksaan hanya pada kolom yang disebut
axis0 (bawaan) atau 1Menghapus baris atau kolom yang mengandung sel kosong
threshBilangan bulat, mis. 5Baris 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.