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.

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

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

  1. Baris 3-8: kolom nama dan kota dibangun dengan spasi ekstra serta kapitalisasi yang campur aduk; output pertama menampilkan kondisi awalnya.
  2. 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.
  3. 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.
  4. Baris 20-21: .str.contains(“Bandung”, regex=False) menghasilkan Series boolean untuk setiap baris.
  5. 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:

MethodFungsi
.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.