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.

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

text
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: int64

Mari kita telaah apa yang terjadi pada kode di atas:

  1. Baris 3: membuat Series peserta berisi kode kota; dtype-nya str karena pandas 3.0 memakai tipe string bawaan untuk teks.
  2. Baris 5: menyiapkan dictionary kode_kota sebagai tabel penerjemah dari kode ke nama kota.
  3. Baris 7: peserta.map(kode_kota) membaca setiap nilai, mencocokkannya dengan kunci dictionary, dan menuliskan padanannya pada Series baru.
  4. Baris 9-14: perintah print menampilkan Series asli, hasil pemetaan, dan rekap value_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.

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

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

text
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: int64

Bedah baris demi baris:

  1. Baris 3: membuat Series catatan yang memuat dua ejaan lama, Djakarta dan Batavia.
  2. Baris 5: replace("Djakarta", "Jakarta") mencari nilai "Djakarta" secara persis lalu menggantinya; ketiga nilai lain dibiarkan.
  3. Baris 11: replace(["Djakarta", "Batavia"], "Jakarta") mengganti dua nilai lama sekaligus dengan satu nilai pengganti.
  4. Baris 12-13: value_counts() merangkum hasil: Jakarta kini muncul empat kali dan Bandung satu 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:

Aspekmap()replace()
Input pemetaandictionary, Series, fungsinilai lama, list, dictionary
Nilai tanpa padananmenjadi NaNtetap dipertahankan
Menerima fungsi kustomyatidak
Kebutuhan tipikalpenerjemahan kode ke labelkoreksi 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.