Mencari pesanan yang kodenya berawalan TRX atau menyeragamkan penulisan kirim menjadi pengiriman adalah pekerjaan teks yang paling sering muncul saat membersihkan data. pandas menyediakan .str.contains() dan .str.startswith() untuk menguji isi kolom, serta .str.replace() untuk mengganti teks — semuanya bekerja per baris secara vectorized. Chapter ini memakai satu tabel pesanan toko untuk menunjukkan filter baris, penggantian sederhana, dan satu perbedaan default yang penting di pandas 3.0: contains() mengartikan pola sebagai regex, sedangkan replace() mengartikannya sebagai teks literal.

Memfilter Baris dengan startswith dan contains #

python
import pandas as pd

pesanan = pd.DataFrame({
    "kode": ["TRX-001", "TRX-002", "REF-003", "TRX-004"],
    "catatan": [
        "Pembayaran QRIS",
        "kirim ke Bandung",
        "Menunggu Transfer",
        "kirim ke Jakarta",
    ],
})

mask = pesanan["kode"].str.startswith("TRX")
print(mask.tolist())
print(pesanan[mask].to_string(index=False))

print(pesanan["catatan"].str.contains("kirim", case=False).tolist())

telepon = pd.Series(["0812-3456-789", "0857-9876-543"])
print(telepon.str.replace("-", "").tolist())

print(pesanan["catatan"].str.replace("kirim", "pengiriman").tolist())

harga = pd.Series(["Rp1.500", "Rp2.000"])
print(harga.str.replace(".", "").tolist())
print(harga.str.replace(".", "", regex=True).tolist())

Output yang Dihasilkan:

text
[True, True, False, True]
   kode          catatan
TRX-001  Pembayaran QRIS
TRX-002 kirim ke Bandung
TRX-004 kirim ke Jakarta
[False, True, False, True]
['08123456789', '08579876543']
['Pembayaran QRIS', 'pengiriman ke Bandung', 'Menunggu Transfer', 'pengiriman ke Jakarta']
['Rp1500', 'Rp2000']
['', '']

Mari kita telaah bagian penting skrip di atas:

  1. Baris 13-14: pesanan["kode"].str.startswith("TRX") menghasilkan mask boolean [True, True, False, True]; REF-003 satu-satunya yang gagal uji.
  2. Baris 15: pesanan[mask] memakai mask tersebut untuk menyaring baris; to_string(index=False) mencetak hasil tanpa kolom index agar ringkas.
  3. Baris 17: contains("kirim", case=False) mencari kata di tengah teks tanpa memedulikan huruf besar/kecil; baris Menunggu Transfer bernilai False karena tidak memuat kata tersebut.

Filter boolean seperti baris 15 adalah pola standar: method uji .str menghasilkan mask, lalu mask dipakai di dalam kurung siku DataFrame. Pola yang sama berlaku untuk contains(), endswith(), atau gabungan beberapa mask dengan operator & dan |.

Mengganti Teks dengan replace #

Baris 19-20 menunjukkan penggantian paling umum: telepon.str.replace("-", "") menghapus seluruh tanda hubung pada nomor telepon, sehingga 0812-3456-789 menjadi 08123456789. Argumen kedua adalah penggantinya; tanpa argumen n, pandas mengganti semua kemunculan di tiap baris. Baris 22 menerapkan replace("kirim", "pengiriman") pada kolom catatan dan hanya baris yang memuat kata tersebut yang berubah, sementara Pembayaran QRIS tetap utuh.

TugasMethodCatatan
Menguji awalan/akhiranstartswith(), endswith()menghasilkan mask boolean
Menguji kata di mana puncontains(pola, case=False)case=False mengabaikan kapitalisasi
Mengganti semua kemunculanreplace(lama, baru)berlaku di semua baris yang cocok
Menghapus teksreplace(lama, "")pengganti string kosong

Default yang Berbeda: contains Regex, replace Literal #

Baris 24-26 menyimpan pelajaran yang paling sering mengejutkan pemula. harga.str.replace(".", "") menghapus titik pada Rp1.500 menjadi Rp1500 karena replace() di pandas 3.0 berperilaku literal secara bawaan — titik dicari sebagai karakter titik, bukan sebagai pola. Namun begitu regex=True ditulis pada baris 26, titik berubah menjadi pola “karakter apa pun” sehingga seluruh isi Rp1.500 dan Rp2.000 terganti menjadi string kosong. Sebaliknya, contains() mengartikan polanya sebagai regex sejak awal, sehingga contains("example.com") akan cocok dengan exampleXcom juga.

MethodDefaultArti default
.str.contains()regex=Truepola dibaca sebagai regular expression
.str.replace()regex=Falsepola dibaca sebagai teks literal

Dokumentasi resmi yang relevan: pandas.Series.str.contains , pandas.Series.str.replace , dan User Guide: Working with text data .

Method pencarian dan penggantian di atas menerima pola sederhana. Untuk memecah satu kolom menjadi beberapa kolom atau menarik bagian tertentu dari kode seperti PLG-001-BUDI, kita butuh split() dan extract() — topik chapter berikutnya.