pandasstringMenengah5 mnt baca

String Methods Pandas: .str Accessor

Bersihkan kolom teks dalam sekejap: lower, strip, replace, split, dan contains, semuanya vektorized.

Operasi String Sekolom Sekaligus

Accessor .str adalah pintu gerbang ke semua operasi string di pandas. Tulis satu baris, dan operasi itu diterapkan ke SELURUH nilai di kolom sekaligus, tanpa loop. Cepat, ringkas, dan enak dibaca.

Kenapa penting untuk data analyst? Karena kolom teks adalah sumber kekacauan nomor satu: "Jakarta", "JAKARTA", " jakarta " dianggap tiga kota berbeda oleh groupby. Membersihkan teks adalah langkah wajib sebelum agregasi apa pun, dan .str adalah alat tercepatnya.

lower, strip, dan Kombinasinya

Tiga method paling sering dipakai, biasanya dirangkai jadi satu pipeline pembersih.

python
import pandas as pd

df = pd.DataFrame({"kota": ["  Jakarta", "BANDUNG", "surabaya  ", "  MEDAN  "]})

df["kota_bersih"] = df["kota"].str.strip().str.lower()
print(df["kota_bersih"].tolist())
# ['jakarta', 'bandung', 'surabaya', 'medan']

.str.strip() membuang spasi di ujung, .str.lower() menyeragamkan huruf. Method .str bisa di-chain karena tiap method mengembalikan Series baru.

replace dan split

.str.replace() mengganti pola teks, .str.split() memecah string jadi bagian-bagian.

python
df = pd.DataFrame({"telepon": ["0812-3456-789", "0813 9876 543", "+62-821-111-222"]})

# Seragamkan format: buang spasi, strip, dan tanda plus
df["tel_bersih"] = (
    df["telepon"]
    .str.replace(" ", "", regex=False)
    .str.replace("-", "", regex=False)
    .str.replace("+", "", regex=False)
)
print(df["tel_bersih"].tolist())
# ['08123456789', '08139876543', '62821111222']

Contoh split yang realistis, memisahkan nama depan dari nama lengkap:

python
df = pd.DataFrame({"nama": ["Budi Santoso", "Ani", "Citra Ayu Lestari"]})

df["nama_depan"] = df["nama"].str.split().str[0]
print(df["nama_depan"].tolist())  # ['Budi', 'Ani', 'Citra']

Triknya: .str.split() menghasilkan list per baris, lalu .str[0] mengambil elemen pertama dari tiap list. Pola ini bekerja untuk indexing apa pun.

contains: Filter Berbasis Teks

.str.contains() mengembalikan boolean per baris, cocok untuk filtering.

python
df = pd.DataFrame({
    "produk": ["Kopi Susu Gula Aren", "Teh Manis Dingin", "Kopi Tubruk", "Jus Alpukat"],
    "terjual": [50, 30, 40, 25],
})

kopi = df[df["produk"].str.contains("Kopi", case=False)]
print(kopi["terjual"].sum())  # 90

# contains mendukung regex untuk pola kompleks
# Produk yang mengandung angka, misalnya "Paket 2in1"
mask_angka = df["produk"].str.contains(r"\d")

Catatan teknis: Secara default .str.contains() memakai regex. Kalau kamu mencari teks literal yang mengandung karakter spesial regex (seperti tanda plus atau kurung), tambahkan regex=False supaya tidak error atau hasilnya aneh.

len dan startswith untuk Validasi

python
df = pd.DataFrame({"kode": ["P001", "P02", "P0003", "X1"]})

# Kode valid: diawali "P" dan panjangnya 4
valid = df["kode"].str.startswith("P") & (df["kode"].str.len() == 4)
print(df[valid]["kode"].tolist())  # ['P001', 'P0003']

Jebakan Umum

SALAH, .str pada kolom berisi NaN tanpa penanganan:

python
# Jangan: NaN membuat beberapa operasi string bermasalah
s = pd.Series(["Jakarta", None, "Bandung"])
print(s.str.lower().tolist())  # ['jakarta', None, 'bandung'] <- None ikut lolos
print(s.str.contains("a").tolist())  # [True, None, True] <- None, bukan False!

BENAR, isi NaN dulu atau pakai parameter na:

python
# Lakukan: tentukan perilaku NaN secara eksplisit
s = pd.Series(["Jakarta", None, "Bandung"])
print(s.str.contains("a", na=False).tolist())  # [True, False, True]
print(s.fillna("").str.lower().tolist())       # ['jakarta', '', 'bandung']

SALAH, lupa .str method tidak mengubah kolom asli:

python
# Jangan: berharap df["kota"] berubah sendiri
df = pd.DataFrame({"kota": ["  Jakarta "]})
df["kota"].str.strip()
print(df["kota"].tolist())  # ['  Jakarta '] <- tetap kotor!

BENAR, assign hasilnya kembali:

python
# Lakukan: simpan hasil ke kolom (baru atau timpa)
df = pd.DataFrame({"kota": ["  Jakarta "]})
df["kota"] = df["kota"].str.strip()
print(df["kota"].tolist())  # ['Jakarta']

Tantangan

Standardisasi kolom kota

Diberi Series kota = [" JAKARTA", "bandung ", None, "Surabaya", "BANDUNG"]. Dengan method .str berantai, buat Series baru yang sudah di-strip dan lower-case, dengan None diubah jadi string kosong. Cetak hasilnya.