Kolom teks yang berasal dari input manusia hampir tidak pernah rapi. Petugas cabang mengetik JAKARTA dengan huruf kapital semua, formulir pendaftaran menyimpan jakarta lengkap dengan spasi tersembunyi, dan data hasil salin-tempel sering membawa tanda baca sisa seperti Bandung.. Pada chapter sebelumnya kita memperbaiki tipe data kolom; sekarang saatnya menormalkan isi teksnya. Chapter ini membahas tiga teknik dasar pembersihan teks di pandas: menghapus spasi berlebih dengan .str.strip(), menyamakan huruf besar-kecil dengan .str.lower(), dan membuang karakter tak diinginkan dengan .str.replace().

Tiga Penyebab Teks Tidak Konsisten #

Sebelum menulis kode pembersihan, kita petakan dulu sumber ketidakkonsistenan yang paling sering muncul. Ketiga penyebab di bawah ini terlihat sepele, tetapi efeknya serius bagi analisis karena pandas menganggap Jakarta dan jakarta sebagai dua nilai yang benar-benar berbeda.

  • Spasi berlebih: Jakarta mengandung spasi di awal dan akhir. Spasi ini tidak terlihat di layar, tetapi tetap dihitung sebagai karakter.
  • Huruf besar-kecil tidak konsisten: JAKARTA, Jakarta, dan jakarta adalah tiga string yang berbeda bagi pandas.
  • Karakter tak diinginkan: tanda titik, koma, titik koma, atau spasi ganda yang terbawa saat mengetik dan menyalin data.

Efek gabungan ketiganya terlihat jelas pada pengukuran label unik. Kolom kota yang seharusnya berisi empat nama kota bisa tercatat delapan label unik. Angka inilah yang akan kita kecilkan dengan pembersihan teks.

Membersihkan Kolom Kota dalam Tiga Langkah #

Skrip berikut menyimpan delapan bentuk label kota yang berantakan ke dalam sebuah Series, lalu membersihkannya bertahap. Kita juga mencetak panjang setiap string dengan .str.len() agar spasi tersembunyi menjadi terlihat sebagai angka, bukan sekadar dugaan. Panduan lengkap seluruh method teks tersedia di user guide text data .

python
import pandas as pd

kota_mentah = pd.Series([
    " Jakarta ",
    "JAKARTA",
    "Bandung.",
    "  bandung,",
    "Surabaya;",
    "SURABAYA",
    "Medan",
    "medan..",
])

laporan = pd.DataFrame({
    "sebelum": kota_mentah,
    "panjang": kota_mentah.str.len(),
})

kota_rapi = kota_mentah.str.strip().str.lower()
kota_rapi = kota_rapi.str.replace(r"[.,;]", "", regex=True)
laporan["sesudah"] = kota_rapi

print(laporan)
print()
print("Label unik sebelum :", kota_mentah.nunique())
print("Label unik sesudah :", kota_rapi.nunique())

Output yang Dihasilkan:

text
      sebelum  panjang   sesudah
0    Jakarta         9   jakarta
1     JAKARTA        7   jakarta
2    Bandung.        8   bandung
3    bandung,       10   bandung
4   Surabaya;        9  surabaya
5    SURABAYA        8  surabaya
6       Medan        5     medan
7     medan..        7     medan

Label unik sebelum : 8
Label unik sesudah : 4

Mari kita telaah apa yang terjadi pada kode di atas:

  1. Baris 3-12 (kota_mentah = pd.Series([...])): kita membuat Series berisi delapan variasi penulisan kota; setiap variasi mewakili salah satu penyebab di atas.
  2. Baris 14-17 (laporan = pd.DataFrame({...})): DataFrame perbandingan disusun dari kolom sebelum dan kolom panjang; nilai 9 pada baris pertama membuktikan Jakarta memuat dua spasi tersembunyi.
  3. Baris 19 (kota_mentah.str.strip().str.lower()): .str.strip() menghapus spasi di kedua ujung string, lalu .str.lower() menyeragamkan seluruh huruf menjadi huruf kecil. Dokumentasi detailnya ada di pandas.Series.str.strip .
  4. Baris 20 (kota_rapi.str.replace(r"[.,;]", "", regex=True)): .str.replace() menghapus titik, koma, dan titik koma di mana pun posisinya dengan menggantinya menjadi string kosong; perilaku method ini didokumentasikan di pandas.Series.str.replace .
  5. Baris 21-26: hasil pembersihan ditambahkan sebagai kolom sesudah, lalu .nunique() membuktikan jumlah label turun dari 8 menjadi 4.

Perhatikan kolom sesudah pada output: keempat kota kini konsisten ditulis huruf kecil tanpa tanda baca. Bentuk huruf kecil ini belum tentu bentuk akhir yang kita inginkan; chapter berikutnya akan memetakannya ke label resmi.

Method str yang Sering Dipakai untuk Pembersihan #

Accessor .str tidak berhenti pada tiga method di atas. Tabel berikut merangkum method yang paling sering dipakai saat pembersihan teks beserta contoh hasilnya.

MethodTugasContoh hasil
.str.strip()Menghapus spasi di kedua ujung string" Jakarta " menjadi "Jakarta"
.str.lower()Menyeragamkan menjadi huruf kecil"JAKARTA" menjadi "jakarta"
.str.title()Huruf kapital di awal setiap kata"jakarta selatan" menjadi "Jakarta Selatan"
.str.replace()Mengganti atau menghapus pola tertentu"Bandung." menjadi "Bandung"
.str.contains()Menguji keberadaan pola, menghasilkan mask boolean"Surabaya;" mengandung "Surabaya"

Dengan tiga langkah di atas, kolom teks sudah bersih dari spasi, perbedaan huruf, dan tanda baca. Namun label yang bermakna sama bisa saja ditulis dengan kata berbeda, misalnya Jkt untuk Jakarta; penyatuan label semacam ini kita bahas pada chapter Standardisasi Label Kategori.