Pandas str: Manipulasi Teks pada Kolom
TL;DR
Accessor .str di pandas ngasih kamu akses ke fungsi manipulasi teks untuk seluruh kolom sekaligus, tanpa perlu loop. Contohnya df['nama'].str.lower() ngubah semua teks jadi huruf kecil, dan .str.strip() ngebuang spasi di ujung. Method umum lain termasuk contains buat nyaring, split buat mecah, dan replace buat ganti teks. Semua jalan vektor, jadi cepat di data besar.
Accessor .str di pandas ngasih kamu fungsi teks untuk satu kolom penuh sekaligus. Nggak perlu loop baris per baris. Cukup satu baris kode buat bersihin ribuan sel.
Data teks di dunia nyata selalu berantakan. Nama toko campur huruf besar-kecil, spasi nyasar, kode nempel jadi satu. Semua ini bikin filter dan grouping gagal.
Kamu bakal lihat method .str paling sering kepakai: lower, strip, contains, split, dan replace. Plus contoh bersihin data nama toko yang beneran acak-acakan.
Apa itu accessor .str di pandas?
Accessor .str adalah pintu masuk ke method teks pandas yang jalan untuk tiap nilai di kolom Series. Kamu tulis df['kolom'].str.method(), dan pandas nerapin method itu ke semua baris sekaligus. Hasilnya Series baru. Karena jalan vektor, prosesnya jauh lebih cepat dari loop Python biasa.
Method di balik .str mirip fungsi string Python standar, kayak lower, upper, dan replace. Bedanya, .str ngerjain seluruh kolom, bukan satu teks.
Gimana cara bersihin teks pakai .str.lower dan .str.strip?
Dua method ini paling dasar buat rapiin teks. .str.lower() ngubah semua huruf jadi kecil, biar 'Beras', 'beras', dan 'BERAS' dianggap sama. .str.strip() ngebuang spasi di awal dan akhir teks yang sering nyelip pas input manual.
import pandas as pd
df = pd.DataFrame({'nama': [' Toko Berkah ', 'WARUNG JAYA', 'kios Amanah ']})
df['nama_bersih'] = df['nama'].str.strip().str.lower()
print(df['nama_bersih'])
# toko berkah
# warung jaya
# kios amanah
Perhatiin method-nya dirangkai: strip dulu, baru lower. Ini disebut chaining, dan urutannya bebas selama tiap langkah balik Series teks. Buat ganti tipe kolom setelah dibersihin, cek fungsi astype di pandas.
Gimana cara nyaring baris pakai .str.contains?
.str.contains() ngecek apakah tiap teks mengandung pola tertentu, dan ngasih True atau False. Hasilnya dipakai buat nyaring baris. Cocok buat nyari semua nama yang punya kata 'warung' atau kode yang mulai dengan huruf tertentu.
mask = df['nama_bersih'].str.contains('toko', na=False)
hasil = df[mask]
Argumen na=False penting. Kalau ada nilai kosong di kolom, contains ngasih NaN yang bikin filter error. Dengan na=False, baris kosong dianggap tidak cocok. Buat filter kondisi lain, teknik ini sering dipadu sama filter baris berdasarkan kondisi di pandas.
Gimana cara mecah dan ganti teks pakai .str.split dan .str.replace?
.str.split() mecah teks jadi bagian berdasarkan pemisah, kayak spasi atau tanda hubung. .str.replace() ganti pola teks dengan teks lain. Dua-duanya sering dipakai buat rapiin kode produk atau misahin nama depan dari nama belakang.
# Mecah kode 'BRS-001' jadi kategori dan nomor
df['kategori'] = df['kode'].str.split('-').str[0]
# Buang titik dari angka teks
df['harga'] = df['harga_teks'].str.replace('.', '', regex=False)
Setelah split, .str[0] ngambil bagian pertama dari tiap hasil pecahan. Buat replace, tambahin regex=False kalau kamu mau ganti teks apa adanya, bukan pola. Referensi lengkap semua method ada di dokumentasi text pandas.
Contoh kasus: bersihin nama toko toko_berkah
Toko_berkah punya data 1.500 pelanggan grosir dengan kolom nama_toko yang diinput banyak kasir beda. Hasilnya kacau: ada yang huruf besar semua, ada spasi dobel, ada yang nulis 'Wrng' singkatan warung. Grouping omzet per toko jadi gagal karena satu toko keitung beberapa kali.
df['nama_toko'] = (
df['nama_toko']
.str.strip()
.str.lower()
.str.replace(r'\s+', ' ', regex=True)
.str.replace('wrng', 'warung', regex=False)
)
jumlah_unik = df['nama_toko'].nunique()
Rangkaian ini ngebuang spasi ujung, samain huruf kecil, mampetin spasi dobel jadi satu, lalu benerin singkatan. Pola \s+ nangkep satu atau lebih spasi.
Hasilnya nendang: sebelum dibersihin, kolom ini punya 1.180 nama unik. Setelah dibersihin, tinggal 940 nama unik. Artinya 240 entri (20%) sebenernya toko yang sama tapi ketulis beda. Setelah dirapiin, laporan omzet per toko baru akurat. Buat hitung frekuensi tiap nama, pandas value_counts langsung kepakai.
Kesalahan umum saat pakai .str
Jebakan pertama: lupa .str error kalau kolomnya bukan teks. Kalau kolom kecampur angka dan teks, pandas nganggapnya object, dan .str kadang ngasih NaN diam-diam. Pastiin kolomnya beneran teks, atau ubah dulu pakai .astype(str).
Jebakan kedua: contains tanpa na=False. Kalau ada sel kosong, filter langsung error. Ini kesalahan paling sering aku lihat di kode pemula.
Jebakan ketiga: lupa regex default. Di pandas versi baru, .str.replace default nganggap pola pertama sebagai regex. Titik dan tanda kurung punya arti khusus di regex. Kalau kamu cuma mau ganti titik biasa, tambahin regex=False, atau titiknya bakal cocok ke semua karakter.
Jebakan keempat: nggak nyimpen hasilnya. Method .str nggak ngubah kolom asli, dia balikin Series baru. Kalau kamu nggak assign balik ke kolom, perubahannya ilang.
FAQ
Kenapa harus pakai .str, bukan loop biasa?
Karena .str jalan vektor, artinya pandas ngolah seluruh kolom sekaligus di level bawah yang jauh lebih cepat dari loop Python. Di data ribuan baris, .str bisa selesai dalam sepersekian detik, sedangkan loop bisa makan waktu berkali lipat. Selain cepat, kodenya juga lebih pendek dan gampang dibaca.
Kenapa .str.contains saya error?
Paling sering karena ada nilai kosong (NaN) di kolom, dan contains nggak tau harus ngasih True atau False buat sel kosong. Tambahin argumen na=False biar sel kosong dianggap tidak cocok. Kalau kamu pakai pola khusus kayak tanda kurung, pastiin juga sintaks regex-nya benar atau matiin regex.
Apa beda .str.replace dengan regex True dan False?
Dengan regex=True, pola yang kamu tulis diperlakukan sebagai ekspresi reguler, jadi karakter kayak titik dan tanda kurung punya arti khusus. Dengan regex=False, pola diganti apa adanya sebagai teks biasa. Kalau cuma mau buang titik dari angka, pakai regex=False biar titiknya nggak dianggap wildcard yang cocok ke semua karakter.
Gimana cara ambil bagian tertentu setelah split?
Setelah .str.split, hasilnya kolom berisi list. Pakai .str dengan indeks buat ambil elemen, misalnya .str[0] buat bagian pertama atau .str[-1] buat bagian terakhir. Kalau mau tiap bagian jadi kolom sendiri, tambahin argumen expand=True di split, jadi hasilnya DataFrame dengan kolom terpisah.
Apakah .str bisa dipakai di index DataFrame?
Bisa. Index pandas juga punya accessor .str, jadi kamu bisa nulis df.index.str.lower() buat rapiin label baris. Ini berguna kalau index kamu berupa nama atau kode teks yang perlu dibersihin. Method yang tersedia sama persis dengan yang di kolom biasa.
Penutup
Accessor .str bikin bersihin teks di pandas cepat dan ringkas. Inget empat method inti: lower dan strip buat rapiin, contains buat nyaring, split dan replace buat olah. Dan selalu pakai na=False di contains.
Mau latihan olah data teks sampai lancar? Coba praktek langsung di NgulikSQL dan materi Python-nya.
Lanjut baca: pandas value_counts buat hitung frekuensi dan filter baris berdasarkan kondisi di pandas.
Mau praktek langsung? Mulai latihan SQL gratis
Latihan interaktif, langsung di browser.
Artikel terkait
NumPy reshape: Ubah Bentuk Array (2026)
Fungsi reshape di NumPy ngatur ulang bentuk array tanpa ngubah datanya. Ini cara pakainya, arti angka -1, dan cara ngeflat array.
NumPy Array: Dasar-Dasar untuk Analis Data (2026)
NumPy array bikin hitungan data di Python jauh lebih cepat dari list biasa. Ini dasar bikin, slicing, dan operasi array buat analis.
Alternatif iterrows yang Lebih Cepat di Pandas
iterrows nyaman ditulis tapi lambat. Ini urutan alternatif iterrows di pandas dari yang tercepat, plus benchmark biar kamu tau kapan pakai yang mana.