Membuang data yang tidak valid berarti kehilangan baris atau elemen lain yang masih sah. Alternatifnya adalah imputasi: mengganti nilai bermasalah dengan angka pengganti yang masuk akal, misalnya rata-rata nilai yang valid. NumPy menyediakan tiga cara penggantian dengan sifat yang berbeda, dan memilih cara yang tepat sama pentingnya dengan memilih angka penggantinya.

Bab ini membahas imputasi mean lewat penugasan mask (mengubah array asli), varian non-mutasi dengan np.where (dari Chapter Memilih Elemen dengan where), serta np.nan_to_num yang memperbaiki nan dan inf dalam satu panggilan.

Imputasi Mean pada Posisi NaN #

python
import numpy as np

suhu = np.array([26.0, np.nan, 28.0, np.nan, 30.0])
rata_valid = np.nanmean(suhu)
print(rata_valid)
suhu[np.isnan(suhu)] = rata_valid
print(suhu)

Output yang Dihasilkan:

text
28.0
[26. 28. 28. 28. 30.]

Mari kita bedah:

  1. Baris 3: lima pembacaan suhu; dua di antaranya tidak terisi.
  2. Baris 4 (np.nanmean(suhu)): rata-rata dihitung atas tiga nilai valid saja (26 + 28 + 30 dibagi 3), menghasilkan 28.0 — pola dari Chapter NaN-aware Aggregation.
  3. Baris 6 (suhu[np.isnan(suhu)] = rata_valid): mask dipakai di sisi kiri penugasan, sehingga hanya posisi nan yang ditimpa nilai pengganti.
  4. Baris 7: array kini bebas nan; perlu dicatat, array asli ikut berubah karena penugasan ini bersifat mutasi.

Varian Non-mutasi dengan np.where #

Bila array asli masih akan dipakai — misalnya untuk audit — versi yang tidak mengubah asal lebih aman. Fungsi np.where(kondisi, x, y) memilih elemen dari x bila kondisi benar, dan dari y bila salah, lalu mengembalikan array baru:

python
import numpy as np

a = np.array([3.0, np.nan, 7.0])
b = np.where(np.isnan(a), 0.0, a)
print(b)
print(a)

Output yang Dihasilkan:

text
[3. 0. 7.]
[ 3. nan  7.]

Penjelasan tiap baris:

  1. Baris 4 (np.where(np.isnan(a), 0.0, a)): di posisi nan, elemen 0.0 dipilih; di posisi lain, elemen a asli dipertahankan.
  2. Baris 5: hasilnya array baru bernilai [3. 0. 7.].
  3. Baris 6: array a tetap utuh dengan nan-nya — tidak ada mutasi, sehingga keputusan penggantian bisa dibatalkan kapan saja.

Perbaikan Sekali Jalan dengan np.nan_to_num #

Data nyata kadang memuat nan sekaligus inf. Alih-alih menyusun beberapa mask, fungsi np.nan_to_num menangani semuanya dalam satu panggilan:

python
import numpy as np

a = np.array([1.5, np.nan, np.inf, -np.inf, 2.0])
print(np.nan_to_num(a, nan=0.0, posinf=1000.0, neginf=-1000.0))
print(np.finfo(np.float64).max)

Output yang Dihasilkan:

text
[    1.5     0.   1000.  -1000.      2. ]
1.7976931348623157e+308

Mari kita telaah:

  1. Baris 4 (np.nan_to_num(a, ...)): argumen nan, posinf, dan neginf menentukan pengganti masing-masing jenis nilai — hasilnya array baru seperti np.where.
  2. Baris 5 (np.finfo(np.float64).max): menampilkan batas terbesar float64, yaitu nilai default pengganti inf bila argumen posinf/neginf tidak diberikan.

Tiga cara di atas dapat dibandingkan sekilas:

MetodeMengubah array asliYang diganti
a[np.isnan(a)] = nilaiya (mutasi)nan saja
np.where(np.isnan(a), nilai, a)tidak (array baru)nan saja
np.nan_to_num(a, ...)tidak (array baru)nan + inf/-inf sekaligus

Untuk kondisi yang lebih kompleks dari sekadar “ganti semua nan” — misalnya mengganti hanya nilai yang valid dan berada di luar rentang wajar — susun masknya terlebih dulu seperti pada Chapter Masking dan Conditional Selection.