Label dan posisi menjawab pertanyaan “di mana”, sementara pertanyaan analisis yang lebih umum berbunyi “yang mana”: tampilkan semua karyawan berumur di atas 27 tahun, atau yang bertempat tinggal di Bandung. Pandas menyelesaikan pertanyaan semacam ini dengan filtering berbasis kondisi boolean, tanpa loop dan tanpa membandingkan baris satu per satu secara manual. Chapter ini membedah cara kerja kondisi boolean, pemakaiannya untuk menyaring baris, serta penggabungan dua kondisi dalam satu seleksi.
Kondisi Menghasilkan Boolean Series #
Perbandingan yang kita tulis pada sebuah kolom dievaluasi pandas sekaligus untuk semua baris (vectorized). Hasilnya bukan satu nilai True atau False, melainkan Series boolean yang berisi satu keputusan untuk setiap baris. Series semacam ini sering disebut boolean mask, dan mekanisme lengkapnya kita bedah lebih dalam pada Chapter Boolean Mask. Kita lihat langsung pada data karyawan, mengikuti pola yang dijelaskan pada panduan Indexing and selecting data
.
import pandas as pd
karyawan = pd.DataFrame(
{
"nama": ["Budi", "Siti", "Dewi", "Andi", "Rina"],
"kota": ["Bandung", "Jakarta", "Surabaya", "Bandung", "Medan"],
"umur": [29, 34, 25, 31, 27],
"gaji": [8500000, 10500000, 7200000, 9800000, 8000000],
},
index=["E001", "E002", "E003", "E004", "E005"],
)
print(karyawan["umur"] > 27)
print()
senior = karyawan[karyawan["umur"] > 27]
print(senior)
print()
dua_syarat = karyawan[(karyawan["kota"] == "Bandung") & (karyawan["umur"] > 28)]
print(dua_syarat)Output yang Dihasilkan:
E001 True
E002 True
E003 False
E004 True
E005 False
Name: umur, dtype: bool
nama kota umur gaji
E001 Budi Bandung 29 8500000
E002 Siti Jakarta 34 10500000
E004 Andi Bandung 31 9800000
nama kota umur gaji
E001 Budi Bandung 29 8500000
E004 Andi Bandung 31 9800000Mari kita telaah peran setiap bagian kode di atas:
- Baris 3-11 (
karyawan = pd.DataFrame(...)): dataset lima karyawan yang sama dengan Chapter-Chapter sebelumnya. - Baris 13 (
print(karyawan["umur"] > 27)): perbandingan kolomumurterhadap 27 menghasilkan Series boolean dengan indexE001sampaiE005. - Baris 16 (
senior = karyawan[karyawan["umur"] > 27]): Series boolean diberikan ke kurung siku DataFrame sehingga hanya barisTrueyang dipilih. - Baris 20-21: dua kondisi digabung dengan operator
&, dan masing-masing dibungkus tanda kurung.
Menyaring Baris dengan Mask #
Output kedua memperlihatkan hasil penyaringan: hanya E001, E002, dan E004 yang lolos karena ketiganya berumur di atas 27. Baris dengan mask True dipertahankan, sedangkan baris dengan mask False tidak ikut dalam hasil. Perhatikan bahwa index asli tetap dipertahankan, terlihat dari lompatan E003 pada hasil; pandas tidak menomori ulang baris hasil filter. Menulis pola lengkap seperti baris 16, karyawan[karyawan["umur"] > 27], adalah kebiasaan yang baik karena maksud seleksinya langsung terbaca.
Menggabungkan Dua Kondisi #
Dua syarat yang harus terpenuhi bersamaan digabung dengan operator & (AND), sedangkan | (OR) menuntut salah satu syarat terpenuhi. Setiap kondisi wajib dibungkus tanda kurung seperti pada baris 20, karena & memiliki urutan pengerjaan yang lebih tinggi daripada operator perbandingan; tanpa kurung, pandas membaca ekspresi dengan urutan yang salah dan error muncul. Output ketiga hanya menampilkan E001 dan E004, dua karyawan yang bertempat tinggal di Bandung sekaligus berumur di atas 28.
Hasil Filter Berperilaku seperti Copy #
Hasil filtering adalah DataFrame baru yang berdiri sendiri, dan sejak pandas 3.0 dengan Copy-on-Write yang selalu aktif (lihat daftar perubahan pandas 3.0
), mengubah nilai pada senior tidak pernah memengaruhi karyawan. Bila tujuan kita mengubah data asli untuk baris-baris yang lolos syarat, gunakan satu akses .loc dengan kondisi di posisi baris, misalnya karyawan.loc[karyawan["umur"] > 27, "gaji"] = 9000000. Pola ini menggantikan penugasan berantai gaya lama yang sudah tidak berlaku. Kombinasi kondisi yang lebih kompleks, seperti tiga syarat sekaligus, kita pelajari pada Chapter berikutnya, Kombinasi Kondisi.
Filtering dengan kondisi menuntaskan rangkaian dasar seleksi data: kita bisa memilih kolom, memotong baris lewat label maupun posisi, dan menyaring baris lewat syarat boolean. Dengan empat pola tersebut, sebagian besar kebutuhan membaca data sudah terjawab. Selanjutnya kita melatih bentuk-bentuk kondisi yang lebih kaya agar seleksi tetap ringkas ketika syaratnya bertambah banyak.