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 #

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

text
['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:

  1. Baris 3-4: kolom status berisi tiga kategori hasil konversi astype("category").
  2. Baris 6-8: add_categories(["retur", "selesai"]) mendaftarkan dua kategori baru tanpa mengubah isi baris; value_counts() lalu menampilkan keduanya dengan hitungan 0.
  3. Baris 10-11: rename_categories({"masuk": "diterima"}) mengganti nama kategori lewat dict; isi baris masuk ikut berganti menjadi diterima karena 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.

MethodEfek pada daftar kategoriEfek pada baris
add_categories()kategori baru ditambahkan di akhirtidak berubah
rename_categories()nama diganti, jumlah tetapnilai ikut berganti nama
remove_categories()kategori dihapusnilai baris itu menjadi NaN
set_categories()daftar ditetapkan ulang sesuai argumenkategori di luar daftar menjadi NaN
remove_unused_categories()kategori tanpa baris dipangkastidak 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.