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) #

python
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:

text
            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 groups

Mari kita telaah bagian penting skrip di atas:

  1. Baris 3-4: alamat.str.split(", ", expand=True) memotong setiap alamat pada ", " dan mengembalikan DataFrame dua kolom; tanpa expand=True, hasilnya list of string di dalam satu Series.
  2. Baris 5: kolom hasil bernama 0 dan 1, lalu diganti menjadi jalan dan kota agar mudah dipakai.
  3. 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'].
  4. Baris 10: rsplit(n=1, expand=True) memecah dari kanan satu kali saja; baris Dewi yang tanpa spasi kedua mendapat NaN di 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.