Bagi manusia, Budi Santoso, budi santoso, dan BUDI SANTOSO terbaca sebagai orang yang sama; bagi pandas, ketiganya adalah tiga string berbeda yang membuat groupby(), merge(), dan filter menghasilkan kelompok palsu. Normalisasi teks adalah langkah menyeragamkannya sebelum data dipakai: memangkas spasi di tepi, menyatukan spasi ganda, menurunkan huruf, dan menghapus tanda baca. Chapter ini merangkai method .str dari chapter-chapter sebelumnya menjadi rantai pembersihan yang urut, lalu menutupnya dengan tampilan akhir yang rapi menggunakan title().
Rantai Normalisasi Nama #
import pandas as pd
nama_mentah = pd.Series([
" Budi Santoso ",
"budi santoso",
"BUDI SANTOSO",
"Siti Aminah",
])
print(nama_mentah.unique().tolist())
bersih = (
nama_mentah.str.strip()
.str.replace(r"\s+", " ", regex=True)
.str.lower()
)
print(bersih.tolist())
print(bersih.unique().tolist())
print(bersih.str.title().tolist())
email = pd.Series(["[email protected]", "[email protected]"])
print(email.str.lower().tolist())
catatan = pd.Series(["Alamat: Jl. Merdeka!", "Telepon: 0812-3456"])
print(catatan.str.replace(r"[^\w\s]", "", regex=True).tolist())Output yang Dihasilkan:
[' Budi Santoso ', 'budi santoso', 'BUDI SANTOSO', 'Siti Aminah']
['budi santoso', 'budi santoso', 'budi santoso', 'siti aminah']
['budi santoso', 'siti aminah']
['Budi Santoso', 'Budi Santoso', 'Budi Santoso', 'Siti Aminah']
['[email protected]', '[email protected]']
['Alamat Jl Merdeka', 'Telepon 08123456']Mari kita telaah bagian penting skrip di atas:
- Baris 9:
unique()pada data mentah menunjukkan empat penulisan berbeda untuk dua orang — inilah masalah yang diselesaikan. - Baris 11-15: tiga method dirangkai dalam satu ekspresi:
str.strip()memangkas spasi di tepi,str.replace(r"\s+", " ", regex=True)menyatukan spasi ganda menjadi satu, danstr.lower()menurunkan seluruh huruf. - Baris 16-17: hasil rantai menampilkan
['budi santoso', 'budi santoso', 'budi santoso', 'siti aminah'], danunique()tinggal dua nilai — dari empat menjadi dua. - Baris 18:
str.title()menghasilkan bentuk tampilanBudi Santosoyang pantas untuk laporan, sementara perbandingan data tetap memakai versilower().
Urutan rantai itu bukan kebetulan: strip() harus berjalan sebelum pola \s+ bekerja agar spasi di tepi tidak ikut diperhitungkan, dan lower() terakhir karena pola regex bersifat peka huruf besar/kecil secara bawaan. Membiasakan satu urutan yang sama di seluruh proyek membuat hasil pembersihan dapat diprediksi.
Email dan Tanda Baca #
Baris 20-21 menyeragamkan email dengan str.lower() saja — email lazim diperbandingkan dalam huruf kecil, dan [email protected] menjadi [email protected]. Baris 23-24 menangani kasus lain: pola r"[^\w\s]" mencocokkan setiap karakter yang bukan huruf, angka, atau spasi, sehingga tanda titik dua, titik, seru, dan hubung dihapus dari catatan — Alamat: Jl. Merdeka! menjadi Alamat Jl Merdeka. Pola [^\w\s] dibaca “apa pun di luar \w dan \s”, kelanjutan langsung dari komponen regex pada chapter sebelumnya.
Satu method lagi layak dikenal: str.casefold() berperilaku seperti lower() tetapi lebih agresif pada alfabet non-Inggris. Untuk data nama dan alamat berbahasa Indonesia, lower() sudah mencakup kasus yang umum; simpan casefold() untuk kolom hasil input multibahasa. Ingat juga bahwa normalisasi mengubah panjang teks, sehingga selisih str.len() sebelum dan sesudah pembersihan bisa dipakai untuk menghitung berapa banyak baris yang tersentuh rantai normalisasi.
| Masalah | Method | Keterangan |
|---|---|---|
| Spasi di tepi teks | str.strip() | juga ada lstrip() dan rstrip() |
| Spasi ganda di tengah | str.replace(r"\s+", " ", regex=True) | satu atau lebih spasi menjadi satu |
| Huruf tidak konsisten | str.lower(), str.title(), str.casefold() | pilih satu untuk seluruh proyek |
| Tanda baca mengganggu | str.replace(r"[^\w\s]", "", regex=True) | menyisakan huruf, angka, spasi |
Dokumentasi resmi yang relevan: User Guide: Working with text data , pandas.Series.str.strip , dan pandas.Series.str.replace .
Setelah nilai-nilai yang sama tersatukan, kolom teks Anda kini berisi sekelompok kecil nilai berulang yang rapi. Kondisi persis itulah yang paling menguntungkan dtype category — topik section ini pada chapter berikutnya.