Kolom teks hampir tidak pernah rapi saat pertama kali diterima: sebagian nama ditulis huruf kapital semua, sebagian membawa spasi ekstra di awal atau akhir, dan formatnya berbeda antar baris. Mengolah nilai satu per satu dengan loop Python bisa saja dilakukan, tetapi pandas menyediakan cara yang jauh lebih ringkas melalui accessor .str. Setiap method string Python memiliki padanan vectorized pada .str, sehingga satu baris kode menerapkan transformasi yang sama ke seluruh kolom. Chapter ini mempraktikkan membersihkan dan menyeragamkan kolom teks dengan .str.
Accessor .str pada Kolom Teks #
Accessor .str dipanggil pada Series bertipe teks dan menghasilkan Series baru dengan panjang yang sama. Method-method .str dapat dirantai, misalnya .str.strip().str.title(), sehingga beberapa langkah pembersihan ditulis berurutan dalam satu baris. Pada pandas 3.0, kolom teks bertipe str secara default, dan accessor .str bekerja penuh dengan tipe tersebut; rincian perubahannya dirangkum di panduan migrasi string . Dokumentasi Working with text data memuat daftar lengkap method yang tersedia.
Membersihkan Data Pelanggan #
Contoh berikut memakai data pelanggan dengan nama dan kota yang ditulis tidak konsisten. Tujuannya: nama berformat kapital di awal tiap kata, kota berformat kapital di awal kalimat, alamat email dibentuk otomatis dari nama, lalu pelanggan dari Bandung disaring.
import pandas as pd
pelanggan = pd.DataFrame(
{
"nama": [" budi santoso ", "SITI RAHAYU", " dewi lestari", "ANDI WIJAYA ", "rina Marlina"],
"kota": [" bandung", "JAKARTA ", "surabaya", " bandung ", "MEDAN"],
}
)
print(pelanggan)
print()
pelanggan["nama"] = pelanggan["nama"].str.strip().str.title()
pelanggan["kota"] = pelanggan["kota"].str.strip().str.capitalize()
pelanggan["email"] = pelanggan["nama"].str.lower().str.replace(" ", ".") + "@example.com"
print(pelanggan)
print()
dari_bandung = pelanggan["kota"].str.contains("Bandung", regex=False)
print(dari_bandung)
print()
print(pelanggan[dari_bandung])Output yang Dihasilkan:
nama kota
0 budi santoso bandung
1 SITI RAHAYU JAKARTA
2 dewi lestari surabaya
3 ANDI WIJAYA bandung
4 rina Marlina MEDAN
nama kota email
0 Budi Santoso Bandung [email protected]
1 Siti Rahayu Jakarta [email protected]
2 Dewi Lestari Surabaya [email protected]
3 Andi Wijaya Bandung [email protected]
4 Rina Marlina Medan [email protected]
0 True
1 False
2 False
3 True
4 False
Name: kota, dtype: bool
nama kota email
0 Budi Santoso Bandung [email protected]
3 Andi Wijaya Bandung [email protected]Mari kita telaah kode di atas:
- Baris 3-8: kolom nama dan kota dibangun dengan spasi ekstra serta kapitalisasi yang campur aduk; output pertama menampilkan kondisi awalnya.
- Baris 13-14: .str.strip() menghapus spasi di ujung teks, lalu .str.title() mengkapitalisasi tiap kata untuk nama dan .str.capitalize() mengkapitalisasi awal kalimat untuk kota.
- Baris 15: .str.lower() menurunkan seluruh huruf, .str.replace(" “, “.”) mengganti spasi dengan titik secara literal, dan operator + menyambung akhiran “@example.com” sehingga email terbentuk seragam.
- Baris 20-21: .str.contains(“Bandung”, regex=False) menghasilkan Series boolean untuk setiap baris.
- Baris 23: boolean mask dari langkah sebelumnya menyaring tabel dan menampilkan dua pelanggan dari Bandung.
Method .str yang Sering Dipakai #
Tabel berikut merangkum method yang paling sering digunakan sehari-hari:
| Method | Fungsi |
|---|---|
| .str.upper() / .str.lower() | ubah ke huruf kapital atau kecil semua |
| .str.title() | kapital pada awal tiap kata |
| .str.capitalize() | kapital pada awal kalimat |
| .str.strip() | buang spasi di awal dan akhir |
| .str.replace(a, b) | ganti teks a dengan b |
| .str.contains(t) | cek keberadaan teks t, hasil boolean |
| .str.len() | panjang tiap teks |
Method str.upper() beserta saudaranya bekerja elemen per elemen dan mengembalikan Series baru, sehingga hasilnya dapat langsung ditugaskan kembali ke kolom yang sama seperti pada contoh. Parameter regex=False pada .str.contains() membuat pola dicari sebagai teks biasa; pola ini juga aman dipakai ketika teks yang dicari memuat titik atau tanda lain yang punya makna khusus di regex.
Satu hal perlu dicatat dari contoh di atas: setiap panggilan .str mengembalikan Series baru, dan menugaskannya kembali ke pelanggan[“nama”] mengganti isi kolom pada DataFrame asal. Lalu bagaimana pandas bersikap ketika kita menyimpan hasil ke variabel lain dan memodifikasinya di sana? Pertanyaan itulah yang dijawab Copy-on-Write pada Chapter terakhir Section ini.