Menggabungkan banyak kondisi kesetaraan dengan operator | cepat melelahkan. Daftar kota sasaran yang berisi lima kota, misalnya, menghasilkan empat operator | yang berulang, dan setiap kota baru menambah satu kondisi lagi. Untuk kebutuhan semacam itu pandas menyediakan isin(), sementara between() meringkas rentang nilai yang secara manual ditulis sebagai dua kondisi >= dan <=. Pada Chapter ini kita mempelajari kedua method tersebut beserta cara mengombinasikannya dengan operator &, |, dan ~ dari chapter sebelumnya.
Menyaring Keanggotaan dengan isin() #
Method isin() dipanggil pada Series kolom dan menerima satu argumen berupa list nilai kandidat. Ekspresi pelanggan["kota"].isin(["Jakarta", "Bandung"]) menghasilkan Series boolean sepanjang data: True bila nilai baris tersebut ada di dalam daftar, False bila tidak. Pencocokan bersifat eksak dan case-sensitive, sehingga nilai "jakarta" tidak dianggap sama dengan "Jakarta". Series boolean hasilnya dipakai persis seperti mask biasa: diberikan ke pelanggan[...] untuk memilih baris.
Membalik Keanggotaan dengan ~ #
Mengambil baris yang tidak termasuk daftar cukup dilakukan dengan menambahkan ~ di depan mask. Ekspresi pelanggan[~mask_kota] menampilkan semua pelanggan yang kotanya di luar daftar sasaran. Penulisan ini jauh lebih ringkas daripada merangkai != untuk setiap kota satu per satu. Pola ~isin() sering dipakai untuk kasus “semua kecuali”, misalnya semua transaksi kecuali kota yang sedang dikecualikan dari kampanye.
Rentang Nilai dengan between() #
Method between() dipanggil pada Series numerik atau tanggal dan menerima dua argumen: batas bawah dan batas atas. Ekspresi pelanggan["umur"].between(25, 35) menghasilkan mask yang True pada baris berumur 25 sampai 35, termasuk kedua ujungnya. Perilaku tersebut setara dengan menulis (pelanggan["umur"] >= 25) & (pelanggan["umur"] <= 35), hanya lebih pendek dan bebas dari salah ketik operator. Bila kedua ujung tidak boleh ikut, berikan argumen inclusive="neither"; pilihan lainnya adalah "left" dan "right" untuk menyertakan satu sisi saja.
Menggabungkan isin() dan between() dengan Kondisi Lain #
Karena isin() dan between() sama-sama mengembalikan mask, keduanya boleh digabung dengan operator bitwise tanpa aturan baru. Kombinasi pelanggan["umur"].between(25, 40) & (pelanggan["total_belanja"] >= 500000) memilih pelanggan berusia 25-40 tahun yang belanjanya di atas 500 ribu. Tanda kurung tetap wajib pada kondisi manual seperti perbandingan >=, persis aturan pada chapter sebelumnya. Dengan dua method ini, kebutuhan filter yang umum di lapangan — keanggotaan daftar, rentang, dan kombinasi keduanya — sudah tercakup hampir seluruhnya.
Contoh Lengkap dan Bedah Kode #
Skrip berikut memakai tabel pelanggan yang sama dengan chapter sebelumnya untuk mendemonstrasikan isin(), negasinya, between(), dan kombinasi keduanya.
import pandas as pd
pelanggan = pd.DataFrame({
"nama": ["Budi", "Siti", "Dewi", "Andi", "Rina", "Tono"],
"kota": ["Jakarta", "Bandung", "Jakarta", "Surabaya", "Bandung", "Jakarta"],
"umur": [34, 29, 41, 23, 37, 25],
"total_belanja": [1250000, 540000, 2100000, 320000, 870000, 450000],
})
kota_sasaran = ["Jakarta", "Bandung"]
mask_kota = pelanggan["kota"].isin(kota_sasaran)
print("isin - pelanggan di Jakarta atau Bandung:")
print(pelanggan[mask_kota])
print()
print("~isin - pelanggan di luar kota sasaran:")
print(pelanggan[~mask_kota])
print()
mask_umur = pelanggan["umur"].between(25, 35)
print("between - umur 25 sampai 35:")
print(pelanggan[mask_umur])
print()
mask_final = pelanggan["umur"].between(25, 40) & (pelanggan["total_belanja"] >= 500000)
print("between digabung kondisi lain:")
print(pelanggan[mask_final])Output yang Dihasilkan:
isin - pelanggan di Jakarta atau Bandung:
nama kota umur total_belanja
0 Budi Jakarta 34 1250000
1 Siti Bandung 29 540000
2 Dewi Jakarta 41 2100000
4 Rina Bandung 37 870000
5 Tono Jakarta 25 450000
~isin - pelanggan di luar kota sasaran:
nama kota umur total_belanja
3 Andi Surabaya 23 320000
between - umur 25 sampai 35:
nama kota umur total_belanja
0 Budi Jakarta 34 1250000
1 Siti Bandung 29 540000
5 Tono Jakarta 25 450000
between digabung kondisi lain:
nama kota umur total_belanja
0 Budi Jakarta 34 1250000
1 Siti Bandung 29 540000
4 Rina Bandung 37 870000Mari kita telaah baris demi baris:
- Baris 3-8 (
pelanggan = pd.DataFrame({...})): tabel enam baris berisi nama, kota, umur, dan total belanja disiapkan sebagai bahan filter. - Baris 10-11 (
mask_kota = pelanggan["kota"].isin(kota_sasaran)): daftar kota sasaran disimpan ke variabel, laluisin()menghasilkan mask dengan lima nilai True karena hanya Andi yang berasal dari Surabaya. - Baris 16-17 (
pelanggan[~mask_kota]): negasi membalik mask sehingga hanya baris Andi yang tampil. - Baris 20 (
mask_umur = pelanggan["umur"].between(25, 35)): rentang inklusif mengambil Budi (34), Siti (29), dan Tono (25); angka 25 ikut karena batas bawah termasuk. - Baris 25 (
mask_final = ... & ...):between(25, 40)digabung dengan syarat belanja minimal 500 ribu; Dewi tidak lolos karena berumur 41, Tono tidak lolos karena belanjanya 450 ribu, sehingga tersisa Budi, Siti, dan Rina.
Semua filter di atas menghasilkan DataFrame baru dan tidak mengubah pelanggan, sesuai perilaku Copy-on-Write pandas 3.0. Bila pertanyaan analisis masih bertambah rumit, menulis kondisi berantai mulai terasa panjang. Chapter berikutnya memperkenalkan query() yang menulis filter yang sama sebagai satu string ekspresi yang lebih dekat ke bahasa manusia.
Referensi resmi: pandas.Series.isin , pandas.Series.between , dan Indexing and selecting data .