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.
"""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())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 &.
# 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#
locmemilih berdasarkan label,ilocberdasarkan posisi, dan keduanya memakai polabaris, 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 danSettingWithCopyWarningtidak pernah muncul.
Referensi#
- User Guide: Indexing and selecting data — pandas documentation
—
dokumentasi resmi
loc,iloc, dan mask boolean. - User Guide: Returning a view versus a copy — pandas documentation
—
penjelasan resmi
SettingWithCopyWarningdan penangkalnya.