Alur bisnis tidak berhenti: pesanan bisa retur sehingga status retur perlu didaftarkan, istilah masuk diganti diterima, atau kategori lama dihapus dari daftar. Semua perubahan itu terjadi pada daftar kategori, bukan pada isi baris, dan accessor .cat yang diperkenalkan pada chapter sebelumnya menyediakan method untuk semuanya: add_categories(), rename_categories(), remove_categories(), dan set_categories(). Chapter ini mempraktikkan keempatnya pada kolom status pesanan, lalu menunjukkan batas pentingnya saat menugaskan nilai kategori baru.
Menambah dan Mengganti Kategori #
import pandas as pd
status = pd.Series(["dikemas", "dikirim", "masuk"]).astype("category")
print(status.cat.categories.tolist())
status2 = status.cat.add_categories(["retur", "selesai"])
print(status2.cat.categories.tolist())
print(status2.value_counts().to_dict())
ganti = status2.cat.rename_categories({"masuk": "diterima"})
print(ganti.cat.categories.tolist())
hapus = status2.cat.remove_categories("dikemas")
print(hapus.tolist())
print(hapus.isna().tolist())
disaring = status2.cat.set_categories(["masuk", "dikemas"])
print(disaring.tolist())
print(disaring.cat.categories.tolist())
try:
status[0] = "retur"
except TypeError as exc:
print(str(exc))
print(status2.cat.remove_unused_categories().cat.categories.tolist())Output yang Dihasilkan:
['dikemas', 'dikirim', 'masuk']
['dikemas', 'dikirim', 'masuk', 'retur', 'selesai']
{'dikemas': 1, 'dikirim': 1, 'masuk': 1, 'retur': 0, 'selesai': 0}
['dikemas', 'dikirim', 'diterima', 'retur', 'selesai']
[nan, 'dikirim', 'masuk']
[True, False, False]
['dikemas', nan, 'masuk']
['masuk', 'dikemas']
Cannot setitem on a Categorical with a new category (retur), set the categories first
['dikemas', 'dikirim', 'masuk']Mari kita telaah bagian penting skrip di atas:
- Baris 3-4: kolom
statusberisi tiga kategori hasil konversiastype("category"). - Baris 6-8:
add_categories(["retur", "selesai"])mendaftarkan dua kategori baru tanpa mengubah isi baris;value_counts()lalu menampilkan keduanya dengan hitungan0. - Baris 10-11:
rename_categories({"masuk": "diterima"})mengganti nama kategori lewat dict; isi barismasukikut berganti menjadiditerimakarena kodenya sama.
Perhatikan bahwa add_categories() menerima daftar kategori yang belum ada; menambahkan nama yang sudah terdaftar menimbulkan ValueError. Penggantian nama dengan dict boleh bersifat parsial — kategori yang tidak disebut tetap dipertahankan — dan bentuk list juga diterima asalkan panjangnya sama dengan daftar kategori lama, sehingga dict adalah bentuk yang lebih aman untuk penggantian sebagian.
Menghapus Kategori dan Akibatnya #
Baris 13-15 memanggil remove_categories("dikemas"); kategori hilang dari daftar, tetapi baris yang tadinya dikemas tidak ikut terhapus — nilainya menjadi NaN, terlihat dari isna() yang bernilai True hanya pada baris pertama. Baris 17-19 menunjukkan cara yang lebih tajam: set_categories(["masuk", "dikemas"]) menetapkan daftar kategori baru sekaligus mengurutkannya ulang sesuai argumen, sehingga baris dikirim yang tidak terdaftar menjadi NaN dan urutan kategori kini ['masuk', 'dikemas']. Terakhir, baris 26 memanggil remove_unused_categories() pada status2 untuk memangkas kategori yang tak terpakai dari daftar — berguna setelah filter menghilangkan banyak baris.
| Method | Efek pada daftar kategori | Efek pada baris |
|---|---|---|
add_categories() | kategori baru ditambahkan di akhir | tidak berubah |
rename_categories() | nama diganti, jumlah tetap | nilai ikut berganti nama |
remove_categories() | kategori dihapus | nilai baris itu menjadi NaN |
set_categories() | daftar ditetapkan ulang sesuai argumen | kategori di luar daftar menjadi NaN |
remove_unused_categories() | kategori tanpa baris dipangkas | tidak berubah |
Batas Penulisan Nilai Baru #
Baris 21-24 mencoba menugaskan retur pada baris pertama saat retur belum terdaftar. pandas menolaknya dengan TypeError: Cannot setitem on a Categorical with a new category (retur), set the categories first — skrip menangkapnya dan mencetak pesan tersebut. Pola yang benar adalah mendaftarkan kategori dulu dengan add_categories("retur"), baru menugaskan nilai barisnya.
Dokumentasi resmi yang relevan: User Guide: Categorical data , pandas.Series.cat.add_categories , pandas.Series.cat.rename_categories , dan pandas.Series.cat.set_categories .
Daftar kategori kini bisa ditambah, diganti, dan dipangkas. Satu kemampuan yang belum dibahas adalah urutan: dikemas, dikirim, selesai punya urutan alur kerja yang bermakna, bukan urutan alfabet — itulah inti chapter Urutan Kategori.