Chapter mengubah-nilai mengganti nilai berdasarkan posisi dan label, sedangkan kebutuhan harian sering mengganti berdasarkan kondisi: setiap stok di bawah ambang dianggap kritis, setiap nilai di luar rentang layak diperbaiki. Boolean indexing menjawab sebagian kebutuhan itu, tetapi hasilnya membuang baris yang tidak lolos — bentuk tabelnya berubah. Method where() dan mask() mengganti nilai persis pada posisi yang memenuhi syarat sambil menjaga bentuk tabel tetap utuh. Chapter ini membahas arah keduanya, parameter other, serta perbandingannya dengan np.where dari NumPy.
Dua Arah yang Berlawanan #
Aturannya satu kalimat: where(kondisi) mempertahankan nilai di tempat kondisi bernilai True, sedangkan mask(kondisi) justru mengganti nilai di tempat kondisi bernilai True. Tanpa argumen kedua, posisi yang diganti menjadi NaN, sehingga hasil langsung menunjukkan lokasi yang tak lolos uji. Parameter other mengisi posisi tersebut dengan nilai tertentu — 0, string, atau Series lain yang sejajar index. Karena bentuk hasil selalu sama dengan input, kedua method aman untuk menambah kolom baru: df["status"] = ... tetap punya satu nilai per baris tanpa ada baris yang hilang.
import numpy as np
import pandas as pd
stok = pd.DataFrame(
{
"produk": ["Kopi", "Teh", "Gula", "Susu"],
"unit": [120, 5, 60, 3],
}
)
# where(): pertahankan yang memenuhi kondisi, sisanya NaN
aman = stok["unit"].where(stok["unit"] >= 10)
print(aman)
# other: nilai pengganti untuk posisi yang tidak memenuhi kondisi
print("\nwhere dengan other=0:")
print(stok["unit"].where(stok["unit"] >= 10, other=0))
# mask(): kebalikan where; yang memenuhi kondisi justru diganti
print("\nmask diganti -1 untuk stok kritis:")
print(stok["unit"].mask(stok["unit"] < 10, other=-1))
# np.where: menghasilkan array penuh, tanpa baris hilang
stok["status"] = np.where(stok["unit"] >= 10, "aman", "kritis")
print("\nstatus np.where:")
print(stok)Output yang Dihasilkan:
0 120.0
1 NaN
2 60.0
3 NaN
Name: unit, dtype: float64
where dengan other=0:
0 120
1 0
2 60
3 0
Name: unit, dtype: int64
mask diganti -1 untuk stok kritis:
0 120
1 -1
2 60
3 -1
Name: unit, dtype: int64
status np.where:
produk unit status
0 Kopi 120 aman
1 Teh 5 kritis
2 Gula 60 aman
3 Susu 3 kritisMari kita telaah baris-baris kuncinya:
- Baris 10-11:
where(unit >= 10)menghasilkan Series denganNaNdi posisi Teh5dan Susu3, sementara baris lain utuh. - Baris 14-15:
other=0mengganti kedua posisi gagal uji menjadi0, menghasilkan Series integer penuh tanpaNaN. - Baris 18-19:
mask(unit < 10, other=-1)membalik arah — kondisi lebih kecil dari 10 adalah yang diganti menjadi-1. - Baris 22-25:
np.where(kondisi, "aman", "kritis")menghasilkan array string sepanjang baris, langsung disimpan sebagai kolomstatus.
where()/mask() vs np.where #
Ketiganya bekerja pada kondisi yang sama tetapi membangun hasil berbeda. np.where dari NumPy menghasilkan array penuh berdasarkan pilihan ganda — cocok saat semua posisi harus punya nilai, seperti kolom status di contoh. where() dan mask() milik pandas mempertahankan index dan dtype perilaku NaN, sehingga pas untuk alur yang perlu tahu posisi mana yang gagal uji sebelum diisi. Pola umumnya berurutan: where() dulu untuk menandai posisi tak valid dengan NaN, lalu fillna() atau aritmetika dengan fill_value menentukan nasib posisi itu.
Menjaga Bentuk pada DataFrame #
Kedua method juga hidup di level DataFrame. df.where(kondisi) dengan kondisi boolean seukuran tabel mempertahankan seluruh baris dan kolom, mengganti sel gagal uji dengan NaN — alat pembersihan yang nyambung langsung ke dropna() dan fillna() pada section Data Cleaning. Parameter axis dan level tersedia untuk pembanding berbentuk Series yang diselaraskan ke baris atau kolom tertentu. Karena hasilnya selalu seukuran input, where() di level DataFrame cocok sebagai langkah pertama pipeline normalisasi sebelum transformasi beratnya dijalankan.
Method-method ini tetap bekerja pada nilai yang sudah ada. Chapter berikutnya pindah ke penamaan: rename() untuk mengubah nama kolom dan index tanpa menyentuh isinya.
Dokumentasi resmi yang relevan: pandas.Series.where
dan pandas.Series.mask
untuk parameter other, axis, dan level, serta NumPy where
sebagai pembanding langsungnya.