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.
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.
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.
.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.
.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.
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.
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.
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.
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.
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.
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.
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.
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.
Model machine learning cuma ngerti angka, bukan teks kayak merah atau biru. get_dummies ngubah kolom kategori jadi kolom 0/1 dalam satu baris kode.
Cara pakai pandas crosstab buat bikin tabel silang yang menghitung frekuensi antar dua kategori. Contoh analisis kategori produk per kota UMKM.
Cara pakai pandas cut dan qcut buat binning data numerik jadi kelompok. Bedanya, kapan pakai yang mana, plus contoh segmentasi pelanggan UMKM.