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 #
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:
28.0
[26. 28. 28. 28. 30.]Mari kita bedah:
- Baris 3: lima pembacaan suhu; dua di antaranya tidak terisi.
- Baris 4 (
np.nanmean(suhu)): rata-rata dihitung atas tiga nilai valid saja (26 + 28 + 30 dibagi 3), menghasilkan28.0— pola dari Chapter NaN-aware Aggregation. - Baris 6 (
suhu[np.isnan(suhu)] = rata_valid): mask dipakai di sisi kiri penugasan, sehingga hanya posisinanyang ditimpa nilai pengganti. - 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:
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:
[3. 0. 7.]
[ 3. nan 7.]Penjelasan tiap baris:
- Baris 4 (
np.where(np.isnan(a), 0.0, a)): di posisinan, elemen0.0dipilih; di posisi lain, elemenaasli dipertahankan. - Baris 5: hasilnya array baru bernilai
[3. 0. 7.]. - Baris 6: array
atetap utuh dengannan-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:
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:
[ 1.5 0. 1000. -1000. 2. ]
1.7976931348623157e+308Mari kita telaah:
- Baris 4 (
np.nan_to_num(a, ...)): argumennan,posinf, danneginfmenentukan pengganti masing-masing jenis nilai — hasilnya array baru sepertinp.where. - Baris 5 (
np.finfo(np.float64).max): menampilkan batas terbesarfloat64, yaitu nilai default penggantiinfbila argumenposinf/neginftidak diberikan.
Tiga cara di atas dapat dibandingkan sekilas:
| Metode | Mengubah array asli | Yang diganti |
|---|---|---|
a[np.isnan(a)] = nilai | ya (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.