Data dari formulir pendaftaran seminar biasanya menyimpan nama kota sebagai kode singkat seperti BDG atau JKT. Untuk laporan yang mudah dibaca, kita perlu menerjemahkan kode tersebut menjadi nama kota lengkap; untuk data hasil input manual, kita juga perlu membetulkan ejaan lama seperti Djakarta. pandas menyiapkan dua method untuk dua kebutuhan itu: map() menerjemahkan setiap nilai berdasarkan pemetaan yang kita sediakan, sedangkan replace() mengganti nilai-nilai tertentu dengan nilai penggantinya. Chapter ini membahas cara kerja keduanya beserta panduan memilih yang mana.
map() untuk Memetakan Nilai #
Method map() pada Series menerima dictionary, Series, atau fungsi, lalu mencari padanan untuk setiap nilai. Padanan yang ditemukan dituliskan pada posisi yang sama, sehingga panjang Series tidak berubah. Ketika sebuah nilai tidak ditemukan padanannya di dictionary, pandas mengisinya dengan NaN. Hasil pemetaan adalah Series baru; karena Copy-on-Write selalu aktif di pandas 3.0, Series asli tetap utuh.
import pandas as pd
peserta = pd.Series(["BDG", "JKT", "SMG", "JKT", "BDG", "MDO"])
kode_kota = {"BDG": "Bandung", "JKT": "Jakarta", "SMG": "Semarang"}
nama_kota = peserta.map(kode_kota)
print(peserta)
print()
print(nama_kota)
print()
print(nama_kota.value_counts())Output yang Dihasilkan:
0 BDG
1 JKT
2 SMG
3 JKT
4 BDG
5 MDO
dtype: str
0 Bandung
1 Jakarta
2 Semarang
3 Jakarta
4 Bandung
5 NaN
dtype: str
Bandung 2
Jakarta 2
Semarang 1
Name: count, dtype: int64Mari kita telaah apa yang terjadi pada kode di atas:
- Baris 3: membuat Series
pesertaberisi kode kota; dtype-nyastrkarena pandas 3.0 memakai tipe string bawaan untuk teks. - Baris 5: menyiapkan dictionary
kode_kotasebagai tabel penerjemah dari kode ke nama kota. - Baris 7:
peserta.map(kode_kota)membaca setiap nilai, mencocokkannya dengan kunci dictionary, dan menuliskan padanannya pada Series baru. - Baris 9-14: perintah
printmenampilkan Series asli, hasil pemetaan, dan rekapvalue_counts()yang menghitung kemunculan tiap nama kota.
Nilai MDO tidak punya kunci di dictionary, sehingga posisi terakhir hasil berisi NaN dan tidak dihitung oleh value_counts(). Pastikan dictionary memuat seluruh nilai yang mungkin muncul, atau tangani NaN setelahnya seperti yang dibahas pada Section Data Cleaning.
map() dengan Fungsi #
Selain dictionary, map() menerima fungsi biasa maupun lambda. Fungsi dipanggil satu kali untuk setiap elemen, mirip apply() pada Series; keistimewaan map() adalah kemampuan menerima dictionary dan Series secara langsung tanpa membungkusnya menjadi fungsi.
panjang_kode = peserta.map(len)Ekspresi di atas menghitung panjang setiap kode kota, sehingga BDG menjadi 3 dan hasilnya bertipe int64. Pola fungsi ini dipakai ketika nilai baru dihitung, bukan sekadar diterjemahkan dari tabel.
replace() untuk Mengganti Nilai Tertentu #
replace() memakai sudut pandang berbeda dari map(): kita menyebut nilai-nilai lama yang ingin diganti, dan seluruh nilai lain tetap dipertahankan. Method ini cocok untuk koreksi tertarget, misalnya menyatukan dua sebutan untuk objek yang sama. Argumen pertama berisi nilai atau daftar nilai yang dicari, argumen kedua berisi nilai penggantinya, dan pencocokan dilakukan secara persis.
import pandas as pd
catatan = pd.Series(["Jakarta", "Djakarta", "Bandung", "Batavia", "Djakarta"])
koreksi = catatan.replace("Djakarta", "Jakarta")
print(catatan)
print()
print(koreksi)
print()
penggabungan = catatan.replace(["Djakarta", "Batavia"], "Jakarta")
print(penggabungan.value_counts())Output yang Dihasilkan:
0 Jakarta
1 Djakarta
2 Bandung
3 Batavia
4 Djakarta
dtype: str
0 Jakarta
1 Jakarta
2 Bandung
3 Batavia
4 Jakarta
dtype: str
Jakarta 4
Bandung 1
Name: count, dtype: int64Bedah baris demi baris:
- Baris 3: membuat Series
catatanyang memuat dua ejaan lama,DjakartadanBatavia. - Baris 5:
replace("Djakarta", "Jakarta")mencari nilai"Djakarta"secara persis lalu menggantinya; ketiga nilai lain dibiarkan. - Baris 11:
replace(["Djakarta", "Batavia"], "Jakarta")mengganti dua nilai lama sekaligus dengan satu nilai pengganti. - Baris 12-13:
value_counts()merangkum hasil:Jakartakini muncul empat kali danBandungsatu kali.
Argumen pencarian juga dapat berupa dictionary yang memetakan nilai lama ke nilai baru, misalnya catatan.replace({"Batavia": "Jakarta"}). Untuk pola lebih rumit, replace() menerima ekspresi reguler ketika kita menambahkan regex=True; pencocokan memakai pola regex alih-alih kesamaan persis. Rinciannya ada di dokumentasi pandas.Series.replace
. Pada DataFrame, pandas.DataFrame.replace
menjalankan pencocokan yang sama di setiap kolom, dan dictionary bertingkat seperti df.replace({"status": {"tutup": "nonaktif"}}) membatasi penggantian hanya pada kolom status.
Kapan map(), Kapan replace() #
Perbedaan keduanya bisa dirangkum dalam satu tabel:
| Aspek | map() | replace() |
|---|---|---|
| Input pemetaan | dictionary, Series, fungsi | nilai lama, list, dictionary |
| Nilai tanpa padanan | menjadi NaN | tetap dipertahankan |
| Menerima fungsi kustom | ya | tidak |
| Kebutuhan tipikal | penerjemahan kode ke label | koreksi nilai tertentu |
Gunakan map() ketika hampir semua nilai perlu diterjemahkan menurut tabel yang kita pegang, dan gunakan replace() ketika hanya sebagian kecil nilai yang perlu disetel ulang. Kalau pemetaan Anda berisi logika perhitungan, map() dengan lambda biasanya lebih ringkas daripada menulis daftar penggantian manual.
Dengan nilai sudah rapi, kebutuhan berikutnya biasanya menambahkan kolom hasil perhitungan. Alih-alih menempel langsung ke DataFrame, assign() mengembalikan DataFrame baru berisi kolom tambahan; method tersebut menjadi topik penuh Chapter berikutnya.