Ekspresi filter dengan & dan | bekerja andal, tetapi penulisan pelanggan["..."] yang berulang membuat baris kode memanjang setiap kali kondisi bertambah. Method query() menawarkan gaya penulisan lain: filter ditulis sebagai satu string ekspresi dengan nama kolom yang dipakai langsung, mirip klausa WHERE pada SQL. Gaya ini mengurangi kebisingan tanda kurung dan kutip ganda, sehingga maksud filter lebih cepat terserap pembaca. Pada Chapter ini kita membahas sintaks dasar query(), kata kunci in dan not in, penyisipan variabel Python, serta pertimbangan kapan gaya ini lebih tepat daripada mask biasa.

Sintaks Dasar query() #

Method query() menerima satu argumen berupa string ekspresi. Di dalam string tersebut, nama kolom ditulis apa adanya tanpa pelanggan["..."], dan operator perbandingan tetap ==, !=, >, <, >=, serta <=. Penggabungan kondisi memakai kata kunci and, or, dan not yang sah di dalam string, sehingga tanda kurung tambahan tidak diperlukan untuk kasus biasa. Hasilnya adalah DataFrame baru berisi baris yang lolos, dan pada pandas 3.0 hasil tersebut selalu aman dimodifikasi karena Copy-on-Write.

Ekspresi pelanggan.query("kota == 'Jakarta' and total_belanja > 500000") membaca hampir seperti kalimat: ambil baris dengan kota Jakarta dan belanja di atas 500 ribu. Perhatikan pemakaian kutip tunggal untuk nilai string di dalam argumen yang dibungkus kutip ganda. Meniadakan salah satu jenis kutip akan membuat string error saat diurai, jadi pertahankan konvensi kutip ganda luar dan kutip tunggal dalam.

Anggota Daftar dengan in dan not in #

Sama seperti isin(), query mendukung pemeriksaan keanggotaan lewat kata kunci in. Ekspresi kategori in ['elektronik', 'buku'] bernilai True bila nilai kolom kategori ada di dalam daftar tersebut. Membaliknya cukup dengan not in, tanpa perlu tanda ~. Kata kunci ini membuat filter keanggotaan tetap satu string, alih-alih bercampur dengan kode Python di luar query.

Variabel Python dengan Tanda @ #

Nilai ambang sering berasal dari variabel, bukan angka yang ditulis langsung. Di dalam string query, variabel Python disisipkan dengan awalan @, misalnya umur >= @umur_min untuk variabel umur_min = 25. Pendekatan ini menghindarkan kita dari menyusun string dengan f-string yang rawan salah kutip. Ketika ambang bisnis berubah, cukup nilai variabelnya yang diperbarui, dan string query tetap utuh.

Kapan Memilih query() dan Kapan Memilih Mask #

AspekMask dengan & dan |query()
Penulisan kolompelanggan["kota"] berulangcukup kota
Penggabungan kondisi&, |, ~ plus tanda kurungand, or, not tanpa kurung wajib
Waktu galat terdeteksisaat menulis kode (editor)saat dijalankan (runtime)
Cocok untukpipeline yang diuji otomatiseksplorasi cepat dan pembaca berlatar SQL

Kedua gaya menghasilkan DataFrame yang sama, sehingga pilihan bergantung pada konteks tim. Untuk kode produksi yang diuji, mask biasa memberi pemeriksaan sintaks lebih awal dari editor dan linter. Untuk eksplorasi data atau komunikasi dengan rekan yang terbiasa SQL, query() lebih ringkas dan mudah dibaca. Kita pun boleh mencampur keduanya dalam satu notebook selama konvensinya konsisten.

Contoh Lengkap dan Bedah Kode #

Skrip berikut menuliskan ulang filter dari chapter-chapter sebelumnya dengan query(), termasuk pemakaian @ dan in.

python
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],
    "kategori": ["elektronik", "fashion", "elektronik", "buku", "fashion", "buku"],
})

hasil = pelanggan.query("kota == 'Jakarta' and total_belanja > 500000")
print("query dasar:")
print(hasil)
print()

umur_min = 25
hasil_variabel = pelanggan.query("umur >= @umur_min and kategori in ['elektronik', 'buku']")
print("query dengan variabel @ dan in:")
print(hasil_variabel)

Output yang Dihasilkan:

text
query dasar:
   nama     kota  umur  total_belanja    kategori
0  Budi  Jakarta    34        1250000  elektronik
2  Dewi  Jakarta    41        2100000  elektronik

query dengan variabel @ dan in:
   nama     kota  umur  total_belanja    kategori
0  Budi  Jakarta    34        1250000  elektronik
2  Dewi  Jakarta    41        2100000  elektronik
5  Tono  Jakarta    25         450000        buku

Mari kita telaah baris demi baris:

  1. Baris 3-9 (pelanggan = pd.DataFrame({...})): tabel pelanggan kini memiliki kolom tambahan kategori agar contoh keanggotaan bisa ditunjukkan.
  2. Baris 11 (hasil = pelanggan.query(...)): string "kota == 'Jakarta' and total_belanja > 500000" memilih baris 0 (Budi) dan baris 2 (Dewi); tidak ada pelanggan["..."] maupun tanda kurung yang ditulis.
  3. Baris 16 (umur_min = 25): ambang umur disimpan sebagai variabel biasa agar bisa diganti tanpa mengubah string query.
  4. Baris 17 (hasil_variabel = pelanggan.query(...)): @umur_min menyisipkan nilai variabel, dan kategori in ['elektronik', 'buku'] membatasi ke dua kategori; hasilnya Budi, Dewi, dan Tono, sementara Andi tersingkir karena berumur 23 tahun.

Hasil kedua query di atas identik dengan hasil filter mask yang setara, karena di balik layar query() juga menyusun boolean mask sebelum memilih baris. Chapter berikutnya membedah mekanisme mask tersebut sehingga kita memahami fondasi yang dipakai ketiga gaya penulisan filter.

Referensi resmi: pandas.DataFrame.query dan Indexing and selecting data .