Seleksi dan Penyaringan

loc, iloc, dan mask boolean untuk mengambil serta menyaring baris dan kolom.

Daftar isi

Seleksi adalah operasi yang paling sering dilakukan pada tabel data, dan pandas menyediakan dua pintu utamanya, yaitu loc untuk label dan iloc untuk posisi, ditambah mask boolean untuk penyaringan berdasarkan syarat. Topik ini membedah ketiganya pada tabel kecil, menunjukkan urutan penilaian yang benar antara label dan posisi, serta penyalinan yang aman sebelum mengubah data. Setelah membacanya, kebingungan SettingWithCopyWarning memiliki sebab dan penangkal yang jelas.

Dua pintu: label dan posisi#

loc memilih berdasarkan label indeks dan nama kolom, sedangkan iloc memilih berdasarkan posisi bilangan bulat mulai dari nol. Keduanya memakai kurung siku ganda dengan pola baris, kolom, dan perbedaannya bukan selera, melainkan makna. Data yang indeksnya waktu membuat loc sangat ekspresif, sebab tanggal dapat langsung ditulis sebagai label.

Skrip berikut memperlihatkan kedua pintu pada tabel pengukuran yang indeksnya adalah tanggal, termasuk perilaku loc ketika satu label muncul lebih dari satu kali.

python seleksi_penyaringan.py
"""Seleksi baris dan kolom: loc, iloc, dan mask boolean."""
import pandas as pd

data = pd.DataFrame(
    {
        "stasiun": ["Stasiun A", "Stasiun B", "Stasiun A", "Stasiun B"],
        "pm25": [34.0, 52.3, 28.0, 61.2],
    },
    index=["2026-03-01", "2026-03-01", "2026-03-02", "2026-03-02"],
)

print(data.loc["2026-03-02", "pm25"])         # berdasarkan label
print(data.iloc[1, 1])                        # berdasarkan posisi
kotor = data[data["pm25"] > 40]               # mask boolean
print(kotor.to_string())
aman = data.copy()                            # salinan aman sebelum diubah
aman["kategori"] = ["Baik", "Sedang", "Baik", "Tidak Sehat"]
print(aman["kategori"].tolist())
text Keluaran
2026-03-02    28.0
2026-03-02    61.2
Name: pm25, dtype: float64
52.3
              stasiun  pm25
2026-03-01  Stasiun B  52.3
2026-03-02  Stasiun B  61.2
['Baik', 'Sedang', 'Baik', 'Tidak Sehat']

Label 2026-03-02 menuntun pada dua baris sekaligus, dan hasilnya Series, sedangkan iloc[1, 1] memilih satu sel berdasarkan posisi. Keduanya sah dan menjawab pertanyaan yang berbeda, yaitu “apa isinya pada tanggal itu” berbanding “apa isinya pada baris kedua”.

Mask boolean sebagai penyaring#

Mask boolean adalah Series benar salah yang panjangnya sama dengan jumlah baris, dan menaruhnya di dalam kurung siku memilih baris yang bernilai benar. Mask dibangun dari perbandingan yang digabung dengan & untuk dan, | untuk atau, serta ~ untuk negasi, dan setiap sisi wajib dibungkus kurung karena prioritas operator perbandingan lebih rendah daripada &.

python Contoh: gabungan dua syarat
# tidak-dijalankan
sedang = data[(data["pm25"] > 40) & (data["stasiun"] == "Stasiun B")]

Penyaringan dengan mask jauh lebih disukai daripada perulangan for atas baris, karena logikanya terbaca sebagai satu kalimat syarat dan eksekusinya dikerjakan tervektorisasi. Untuk syarat yang panjang, metode .query() menuliskannya sebagai kalimat, misalnya data.query("pm25 > 40 and stasiun == 'Stasiun B'"), dan keduanya menghasilkan tabel yang sama.

Mask juga berguna untuk memilih kolom numerik secara dinamis, misalnya data.select_dtypes("number") atau mask pada dtypes, dan pola ini muncul lagi pada pra-pemrosesan modul machine learning ketika kolom numerik dan kategori diperlakukan berbeda.

Salinan yang aman sebelum diubah#

Pemilihan dengan mask atau loc sering menghasilkan tampilan, bukan salinan, sehingga menulis ke hasilnya memicu SettingWithCopyWarning, yaitu peringatan bahwa perubahan mungkin tidak diterapkan pada tabel aslinya. Peringatan ini bukan error, tetapi menandakan pertanyaan yang harus dijawab, yaitu apakah perubahan dimaksudkan untuk tabel asli atau untuk hasil saringan.

Penangkalnya disiplin dan murah, yaitu panggil .copy() pada saat menyaring bila hasilnya akan diubah, persis seperti pada baris aman = data.copy() di atas. Dengan salinan itu, penambahan kolom kategori tidak menyentuh tabel asli, dan peringatan tidak pernah muncul.

Kebiasaan ini juga menjaga keutuhan data mentah pada alur analisis. Tabel mentah tetap utuh sebagai sumber kebenaran, sedangkan setiap transformasi menghasilkan tabel baru yang berarah dari mentah menuju siap pakai, dan jejak itu kelak terdokumentasi pada notebook EDA.

Kesalahan umum#

Kesalahan pertama adalah tertukar loc dan iloc pada indeks yang berupa angka. Tabel dengan indeks 0, 1, 2 membuat keduanya tampak sama, dan perbedaannya baru terlihat setelah baris disaring dan indeksnya meloncat. Kebiasaan yang aman adalah memakai loc untuk label dan iloc hanya saat posisi benar-benar dimaksud.

Kesalahan kedua adalah menggabungkan syarat dengan and dan or milik Python pada mask pandas. Kedua kata itu hanya sah untuk nilai tunggal, sedangkan mask membutuhkan & dan | beserta tanda kurung pada setiap syaratnya, dan error ValueError yang menyinggung ambiguitas adalah tandanya.

Kesalahan ketiga adalah mengubah hasil saringan tanpa salinan. Perubahan itu kadang diterapkan dan kadang tidak, tergantung cara pandas memilih memori internalnya, dan perilaku yang tidak pasti jauh lebih berbahaya daripada peringatan yang terlihat.

Ringkasan#

  • loc memilih berdasarkan label, iloc berdasarkan posisi, dan keduanya memakai pola baris, kolom.
  • Mask boolean menyaring baris dengan syarat yang digabung &, |, dan ~, dengan tanda kurung pada setiap syarat.
  • .query() menuliskan syarat panjang sebagai kalimat dan menghasilkan tabel yang sama dengan mask.
  • Panggil .copy() pada hasil saringan yang akan diubah, sehingga tabel mentah tetap utuh dan SettingWithCopyWarning tidak pernah muncul.

Referensi#