Pandas + np.where: Buat Kolom Bersyarat
TL;DR
np.where dari NumPy bikin kolom baru di pandas berdasarkan kondisi, dengan sintaks np.where(kondisi, nilai_jika_benar, nilai_jika_salah). Contoh: df['status'] = np.where(df['laba'] > 0, 'Untung', 'Rugi'). Karena vektorisasi, np.where jauh lebih cepat dari apply dengan lambda, terutama di data besar. Buat lebih dari dua kategori, pakai np.select.
np.where dari NumPy bikin kolom baru di pandas berdasarkan sebuah kondisi. Sintaksnya np.where(kondisi, nilai_jika_benar, nilai_jika_salah). Contoh cepat: df['status'] = np.where(df['laba'] > 0, 'Untung', 'Rugi').
Fungsi ini kepakai tiap kali kamu mau nandain baris berdasarkan aturan. Baris yang lolos kondisi dapat satu nilai, sisanya dapat nilai lain.
Aku tunjukin sintaks dasarnya, versi bertingkat buat banyak kategori, sama kenapa ini jauh lebih cepat dari apply.
Apa itu np.where di pandas?
np.where adalah fungsi NumPy yang milih antara dua nilai berdasarkan kondisi, elemen per elemen. Buat tiap baris, dia ngecek kondisinya. Kalau True, dia ambil nilai pertama. Kalau False, dia ambil nilai kedua. Hasilnya array yang bisa langsung kamu taruh jadi kolom baru di DataFrame.
Karena np.where dari NumPy, kamu perlu import dua-duanya:
import pandas as pd
import numpy as np
Bentuk dasarnya nerima tiga bagian: kondisi, nilai kalau benar, dan nilai kalau salah. Ketiganya bisa berupa nilai tunggal atau kolom.
Gimana cara pakai np.where buat kolom bersyarat?
Tulis kondisi di argumen pertama, lalu dua kemungkinan hasil di argumen kedua dan ketiga. Simpan hasilnya ke kolom baru.
df['status'] = np.where(df['laba'] > 0, 'Untung', 'Rugi')
Baris dengan laba di atas nol dapat label "Untung", sisanya "Rugi". Satu baris kode, beres buat seluruh kolom.
Nilai hasil nggak harus teks. Bisa angka, hasil hitungan, atau kolom lain. Contoh, kasih diskon 10% cuma buat order di atas 1 juta:
df['harga_final'] = np.where(
df['total'] > 1_000_000,
df['total'] * 0.9,
df['total']
)
Di sini argumen kedua dan ketiga sama-sama kolom. np.where milih per baris mana yang dipakai.
Cara pakai np.where dengan banyak kondisi
Buat gabungin beberapa syarat, pakai operator & buat DAN dan | buat ATAU. Bungkus tiap kondisi dalam kurung.
df['segmen'] = np.where(
(df['laba'] > 0) & (df['kota'] == 'Bandung'),
'Target',
'Bukan Target'
)
Kurung di tiap kondisi itu wajib. Operator & di numpy punya prioritas yang beda dari kata and biasa di Python, dan lupa kurung bikin error atau hasil salah.
Kalau kategorimu lebih dari dua, jangan maksa np.where bertingkat. Pakai np.select yang lebih rapi:
kondisi = [
df['nilai'] >= 80,
df['nilai'] >= 60,
df['nilai'] >= 40
]
label = ['A', 'B', 'C']
df['grade'] = np.select(kondisi, label, default='D')
np.select ngecek kondisi dari atas ke bawah dan ambil label pertama yang cocok. Argumen default ngisi baris yang nggak lolos kondisi mana pun.
np.where vs apply vs np.select
Tiga cara umum buat bikin kolom bersyarat. Masing-masing punya tempatnya.
| Cara | Cocok buat | Kecepatan |
|---|---|---|
| np.where | Dua kategori, kondisi sederhana | Paling cepat (vektorisasi) |
| np.select | Tiga kategori atau lebih | Cepat (vektorisasi) |
| apply + lambda | Logika rumit yang susah divektorisasi | Lambat (baris per baris) |
Aturan praktisnya: coba np.where atau np.select dulu. Baru pindah ke apply kalau logikanya beneran nggak bisa ditulis sebagai kondisi vektor.
Contoh kasus: klasifikasi order toko_berkah
Anggap kamu pegang data 1 juta transaksi toko_berkah. Kamu mau nandain tiap order sebagai "Grosir" atau "Eceran" berdasarkan jumlah barang.
df['tipe_order'] = np.where(df['qty'] >= 12, 'Grosir', 'Eceran')
Selain ringkas, np.where juga jauh lebih cepat dari apply. Di 1 juta baris ini, np.where bikin kolom label selesai sekitar 6 ms. Cara yang sama pakai apply dengan lambda butuh sekitar 640 ms. Bedanya lebih dari seratus kali lipat.
Di data kecil selisih ini nggak kerasa. Tapi begitu datamu ratusan ribu baris ke atas, kebiasaan pakai np.where nghemat waktu tunggu yang nyata tiap kali kamu jalanin ulang notebook.
Kesalahan umum waktu pakai np.where
Kesalahan pertama: pakai and atau or buat gabung kondisi. Di numpy harus pakai & dan | dengan kurung di tiap kondisi. Pakai and bikin error "ambiguous truth value".
Kesalahan kedua: lupa import numpy. np.where butuh import numpy as np. Tanpa itu, Python nggak kenal np dan langsung error.
Kesalahan ketiga: maksa np.where bertingkat buat banyak kategori. Tiga tingkat np.where udah susah dibaca dan gampang salah. Ganti ke np.select yang emang dirancang buat kasus ini.
Pertanyaan yang sering muncul soal np.where
Bisa nggak np.where dipakai buat isi nilai kosong?
Bisa, tapi buat ngisi NaN biasanya lebih pas pakai fillna. np.where lebih cocok kalau syaratnya bukan cuma soal kosong, misalnya "kalau stok di bawah 5, tulis Restok, selain itu tulis Aman". Buat sekadar ganti NaN dengan satu nilai, fillna lebih langsung dan jelas maksudnya.
Apakah hasil np.where selalu berupa array numpy?
Iya, np.where balikin array NumPy. Tapi begitu kamu taruh jadi kolom DataFrame lewat df['kolom'] = ..., pandas otomatis ngubahnya jadi Series. Jadi kamu nggak perlu konversi manual. Kolom hasilnya bisa langsung dipakai buat filter, groupby, atau operasi pandas lain.
Gimana np.where nangani tipe data campur?
Kalau nilai benar dan salah beda tipe, misalnya angka dan teks, np.where naikin hasilnya ke tipe yang lebih umum, biasanya object. Ini bisa bikin kolom jadi lebih berat dari perlu. Usahakan dua nilai hasilnya setipe biar kolomnya tetap efisien dan gampang diolah lanjut.
Kesimpulan
np.where bikin kolom bersyarat di pandas lewat np.where(kondisi, nilai_benar, nilai_salah), dan jauh lebih cepat dari apply karena vektorisasi. Buat lebih dari dua kategori, pindah ke np.select biar tetap kebaca.
Mau lanjut ngulik cara bikin kategori lain? Baca binning data pakai cut dan qcut buat ngelompokin angka jadi rentang, atau dasar NumPy array buat pondasi di baliknya.
Referensi lengkap ada di dokumentasi resmi numpy.where. Coba langsung di dataset kamu, ganti satu kolom label yang tadinya pakai apply jadi np.where, dan rasain bedanya.
Mau praktek langsung? Mulai latihan SQL gratis
Latihan interaktif, langsung di browser.
Artikel terkait
NumPy reshape: Ubah Bentuk Array (2026)
Fungsi reshape di NumPy ngatur ulang bentuk array tanpa ngubah datanya. Ini cara pakainya, arti angka -1, dan cara ngeflat array.
NumPy Array: Dasar-Dasar untuk Analis Data (2026)
NumPy array bikin hitungan data di Python jauh lebih cepat dari list biasa. Ini dasar bikin, slicing, dan operasi array buat analis.
Alternatif iterrows yang Lebih Cepat di Pandas
iterrows nyaman ditulis tapi lambat. Ini urutan alternatif iterrows di pandas dari yang tercepat, plus benchmark biar kamu tau kapan pakai yang mana.