TL;DR
Buat filter baris DataFrame di pandas, pakai boolean indexing: df[df['kolom'] > nilai]. Kondisi menghasilkan deret True/False, dan pandas cuma nyimpen baris yang True. Gabungin banyak syarat pakai & (dan) atau | (atau), tiap kondisi wajib dibungkus kurung.
Buat filter baris DataFrame di pandas, pakai boolean indexing: df[df['kolom'] > nilai]. Kondisi di dalam kurung ngasih deret True dan False, lalu pandas cuma nyimpen baris yang True.
Ini operasi paling sering dipakai pas olah data. Ambil transaksi di atas sekian, saring pelanggan dari kota tertentu, buang baris yang nilainya nol. Semua lewat pola yang sama.
Di artikel ini kamu bakal belajar filter satu syarat, gabungin banyak kondisi, pakai isin dan str.contains, sampai kesalahan yang paling sering bikin error.
Caranya lewat boolean indexing. Kamu tulis kondisi di dalam kurung siku, dan pandas balikin cuma baris yang memenuhi. Kondisi kayak df['omzet'] > 100 ngasih deret True/False sepanjang DataFrame, lalu dipakai buat nyaring.
import pandas as pd
df = pd.DataFrame({
'nama': ['Budi', 'Sari', 'Andi', 'Rina'],
'kota': ['Bandung', 'Bekasi', 'Bandung', 'Bogor'],
'omzet': [120, 90, 150, 80]
})
# Baris dengan omzet di atas 100
df[df['omzet'] > 100]
Hasilnya cuma baris Budi dan Andi. Sisanya kebuang karena omzet-nya di bawah 100. Pola yang sama juga bisa ditulis pakai .loc, yang aku bahas di loc vs iloc.
Buat lebih dari satu syarat, pakai & buat "dan" dan | buat "atau". Aturan wajib: tiap kondisi dibungkus kurung sendiri.
# Omzet di atas 100 DAN dari Bandung
df[(df['omzet'] > 100) & (df['kota'] == 'Bandung')]
# Dari Bekasi ATAU Bogor
df[(df['kota'] == 'Bekasi') | (df['kota'] == 'Bogor')]
Kenapa harus pakai & dan |, bukan and dan or? Karena pandas ngolah per elemen, sedangkan and Python cuma buat satu nilai boolean. Pakai and di sini langsung error.
Kalau mau nyaring baris yang nilainya ada di sebuah daftar, isin lebih rapi dari nulis banyak OR.
# Dari Bandung atau Bogor, tanpa nulis dua kondisi
df[df['kota'].isin(['Bandung', 'Bogor'])]
Mau kebalikannya, yaitu yang bukan dari daftar itu? Tambah tanda ~ di depan.
df[~df['kota'].isin(['Bandung', 'Bogor'])]
Tanda ~ itu operator NOT di pandas. Dia ngebalik semua True jadi False dan sebaliknya.
Buat nyari baris yang teksnya mengandung kata tertentu, pakai str.contains.
# Nama yang mengandung huruf 'a' (case-insensitive)
df[df['nama'].str.contains('a', case=False, na=False)]
Parameter na=False penting biar baris kosong ga bikin error. Tanpa itu, nilai NaN di kolom teks bisa munculin error waktu dicocokin.
Buat kondisi panjang, metode query bikin kode lebih enak dibaca karena mirip kalimat.
df.query("omzet > 100 and kota == 'Bandung'")
Di dalam query, kamu boleh pakai and dan or biasa karena diproses beda dari boolean indexing. Buat filter yang ribet, ini sering lebih gampang dibaca berbulan-bulan kemudian.
Di dataset toko_berkah ngulikdata ada DataFrame 14.880 transaksi. Tim mau cari transaksi Minuman di atas Rp50.000 dari cabang Bandung, buat evaluasi promo.
hasil = df[
(df['kategori'] == 'Minuman') &
(df['nilai'] > 50000) &
(df['cabang'] == 'Bandung')
]
print(len(hasil))
Dari 14.880 baris, filter tiga syarat ini nyisain 487 transaksi. Waktu aku cek, ternyata 62% dari transaksi Minuman di atas Rp50.000 justru datang dari cabang Bandung doang, padahal ada 3 cabang. Angka kayak gini yang bikin keputusan alokasi stok promo jadi lebih terarah, bukan nebak. Buat ngeringkas hasilnya per hari atau per produk, tinggal lanjut pakai groupby.
& dan |.df[df['a'] > 1 & df['b'] < 2] error karena urutan operasi. Bungkus: df[(df['a'] > 1) & (df['b'] < 2)].na=False, baris kosong bikin error. Selalu tambahin parameter itu.df[kondisi]['kolom'] = x bisa munculin SettingWithCopyWarning. Pakai df.loc[kondisi, 'kolom'] = x.Karena pandas ngolah kondisi per elemen di seluruh kolom, bukan satu nilai boolean tunggal. Kata and dan or bawaan Python cuma bisa buat satu nilai, jadi mereka error di boolean indexing. Ganti pakai & buat dan, | buat atau, dan bungkus tiap kondisi dalam kurung. Aturan ini beda dari Python biasa dan sering bikin pemula bingung.
Dua-duanya nyaring baris dengan hasil sama. df[kondisi] pakai boolean indexing, lebih fleksibel dan cepat buat kondisi sederhana. df.query() nulis kondisi sebagai string mirip kalimat, jadi lebih kebaca buat filter panjang dan boleh pakai and atau or biasa. Pilih query kalau kondisinya ribet dan pengen kode yang gampang dibaca ulang.
Pakai isna() buat nyari baris kosong dan notna() buat yang terisi. Contoh: df[df['kolom'].isna()] ngasih baris yang kolomnya kosong, sedangkan df[df['kolom'].notna()] ngasih yang ada isinya. Ini beda dari membandingkan pakai == karena NaN ga pernah sama dengan apa pun, termasuk dirinya sendiri.
Filter biasanya ngasih DataFrame baru berupa hasil saringan, dan DataFrame asli tetap utuh. Kalau kamu mau simpan hasilnya, assign ke variabel baru kayak hasil = df[kondisi]. Kalau mau ngubah nilai di baris terfilter, pakai df.loc[kondisi, 'kolom'] = nilai supaya perubahan beneran masuk ke DataFrame asli tanpa munculin warning.
Filter baris di pandas intinya boolean indexing: df[kondisi]. Gabungin banyak syarat pakai & dan |, selalu bungkus kurung, dan pakai isin atau str.contains buat kasus khusus.
Buat kondisi panjang, query bikin kode lebih kebaca. Buat ubah nilai terfilter, pakai .loc biar aman.
Mau lanjut olah data pandas? Baca loc vs iloc dan groupby, lalu latihan konsep data di Ngulik Data. Referensi resmi ada di dokumentasi boolean indexing pandas.
Mau praktek langsung? Mulai latihan SQL gratis
Latihan interaktif, langsung di browser.
Nama toko ketik campur huruf besar-kecil, spasi nyasar di ujung, atau kode produk nempel jadi satu. Accessor .str di pandas ngerapiin semua itu tanpa loop.
Model machine learning cuma ngerti angka, bukan teks kayak merah atau biru. get_dummies ngubah kolom kategori jadi kolom 0/1 dalam satu baris kode.
Cara pakai pandas crosstab buat bikin tabel silang yang menghitung frekuensi antar dua kategori. Contoh analisis kategori produk per kota UMKM.