Satu kolom sering menyimpan beberapa informasi sekaligus: alamat Jl. Merdeka 10, Jakarta menyimpan jalan dan kota, sementara kode PLG-001-BUDI menyimpan nomor dan nama. pandas menyediakan dua jalan untuk memisahkannya: .str.split() memotong teks pada pemisah yang diketahui, dan .str.extract() menarik bagian yang cocok dengan pola. Chapter ini membahas keduanya pada data alamat dan kode pesanan, termasuk bentuk hasil masing-masing — Series, DataFrame, atau kolom bernama sesuai grup pola.
Memecah Kolom dengan split(expand=True) #
import pandas as pd
alamat = pd.Series(["Jl. Merdeka 10, Jakarta", "Jl. Sudirman 5, Bandung"])
pecah = alamat.str.split(", ", expand=True)
pecah.columns = ["jalan", "kota"]
print(pecah)
nama = pd.Series(["Budi Santoso", "Siti Aminah", "Dewi"])
print(nama.str.split().str.get(0).tolist())
print(nama.str.rsplit(n=1, expand=True))
pesanan = pd.Series(["PLG-001-BUDI", "PLG-002-SITI"])
print(pesanan.str.extract(r"PLG-(\d+)", expand=False).tolist())
bagian = pesanan.str.extract(r"PLG-(?P<nomor>\d+)-(?P<nama>[A-Z]+)")
print(bagian)
print(bagian.dtypes.tolist())
try:
pesanan.str.extract(r"PLG-\d+")
except ValueError as exc:
print(str(exc))Output yang Dihasilkan:
jalan kota
0 Jl. Merdeka 10 Jakarta
1 Jl. Sudirman 5 Bandung
['Budi', 'Siti', 'Dewi']
0 1
0 Budi Santoso
1 Siti Aminah
2 Dewi NaN
['001', '002']
nomor nama
0 001 BUDI
1 002 SITI
[<StringDtype(na_value=nan)>, <StringDtype(na_value=nan)>]
pattern contains no capture groupsMari kita telaah bagian penting skrip di atas:
- Baris 3-4:
alamat.str.split(", ", expand=True)memotong setiap alamat pada", "dan mengembalikan DataFrame dua kolom; tanpaexpand=True, hasilnya list of string di dalam satu Series. - Baris 5: kolom hasil bernama
0dan1, lalu diganti menjadijalandankotaagar mudah dipakai. - Baris 8-9:
nama.str.split().str.get(0)memecah pada spasi lalu mengambil bagian pertama — cara ringkas mengambil nama depan, menghasilkan['Budi', 'Siti', 'Dewi']. - Baris 10:
rsplit(n=1, expand=True)memecah dari kanan satu kali saja; barisDewiyang tanpa spasi kedua mendapatNaNdi kolom kedua.
Dua perilaku pada baris 10 layak dicermati. Argumen n=1 membatasi jumlah pemisahan sehingga Budi Santoso terbelah hanya pada spasi terakhir, dan kolom hasil bertipe StringDtype dengan isi yang kurang diisi NaN — bukan string kosong. Padding NaN inilah yang membuat expand=True aman dipakai meski jumlah bagian tiap baris tidak sama.
Tanpa argumen expand, split() mengembalikan list of string di dalam satu kolom — bentuk yang cocok untuk menghitung jumlah bagian dengan str.len() atau mengambil bagian ke-n dengan str.get(). Dengan expand=True, hasilnya DataFrame yang bisa langsung ditempel kembali ke tabel asli lewat concat(axis=1) atau penugasan kolom. Kebiasaan yang sehat adalah menentukan tujuan akhirnya lebih dulu: analisis per bagian memakai DataFrame, pemeriksaan cepat cukup dengan list.
Pemilihan antara split() dan extract() bisa diringkas dari bentuk datanya. Gunakan split() ketika pemisahnya pasti — koma, spasi, atau tanda hubung — dan setiap bagian hasilnya bermakna sebagai kolom tersendiri. Gunakan extract() ketika posisi bagian tidak tetap atau bagian yang diinginkan hanya sebagian kecil dari teks, misalnya menarik angka di tengah kode yang panjangnya berubah-ubah. Dalam praktiknya keduanya sering dipakai bertahap: split() membuka struktur umum, lalu extract() menyisihkan detail bernomor yang formatnya khusus.
Menarik Pola dengan extract #
Saat pemisahnya tidak konsisten tetapi bentuknya teratur, extract() lebih tepat. Baris 12-13 memakai pola r"PLG-(\d+)" dengan expand=False untuk menarik angka setelah PLG-; hasilnya Series ['001', '002']. Pasangan tanda kurung (\d+) disebut capture group, dan itulah bagian yang diambil extract(). Baris 15-17 memakai dua capture group bernama, (?P<nomor>\d+) dan (?P<nama>[A-Z]+), sehingga hasilnya DataFrame dengan kolom nomor dan nama bertipe str.
Baris yang tidak cocok dengan pola menghasilkan NaN, sehingga extract() sekaligus menjadi alat validasi: jumlah baris NaN menunjukkan berapa entri yang berformat salah. Untuk menarik lebih dari satu kecocokan per baris, gunakan extractall().
Dokumentasi resmi yang relevan: pandas.Series.str.split , pandas.Series.str.extract , dan User Guide: Working with text data .
Pola pada chapter ini memakai simbol regex seperti \d dan [A-Z] tanpa penjelasan penuh. Chapter Regular Expressions berikutnya membedah simbol-simbol tersebut sehingga pola yang Anda tulis benar-benar terkendali.