Seleksi dengan iloc

Seleksi berbasis posisi dengan iloc beserta kontrasnya dengan loc.

Daftar isi

Seleksi berbasis posisi menunjuk baris dan kolom lewat bilangan urut, dan alat utamanya adalah df.iloc[baris, kolom]. Topik ini membahas pemilihan satu posisi, list posisi, slice posisi yang bersifat eksklusif, perbandingan sistematis loc dan iloc pada data yang sama, serta pasangan aksesor at dan iat untuk satu sel. Setelah membaca, pemilihan alat antara label dan posisi dapat dilakukan secara sadar pada dataset log sensor tiga ruangan.

Satu posisi dan list posisi#

iloc menerima bilangan bulat nol basis untuk baris dan kolom, sehingga df.iloc[0] selalu berarti baris pertama tanpa peduli apa yang tertulis pada indeksnya. Satu pasangan posisi menghasilkan nilai sel tunggal, satu posisi baris menghasilkan Series sepanjang kolom, dan list posisi menghasilkan DataFrame dengan baris-baris yang dipilih. Dataset log sensor tetap dibangun oleh generator deterministik yang sama sebelum disimpan ke CSV.

python Membangun dataset log sensor dan menyimpannya ke CSV
import numpy as np
import pandas as pd

rng = np.random.default_rng(42)
n = 96
df = pd.DataFrame({
    "waktu": pd.date_range("2026-01-05 07:00", periods=n, freq="15min"),
    "ruang": rng.choice(["Lab A", "Lab B", "Ruang Arsip"], n, p=[0.4, 0.35, 0.25]),
    "suhu_c": np.round(rng.normal(24, 1.5, n), 1),
    "lembap_pct": np.round(rng.normal(60, 5, n), 1),
    "status_sensor": rng.choice(["normal", "kalibrasi", "rusak"], n, p=[0.85, 0.10, 0.05]),
})
df.to_csv("sensor_log.csv", index=False)  # disimpan agar blok berikutnya cukup membaca berkas ini
print("sel pertama kolom suhu:", df.iloc[0, 2])
text Keluaran
sel pertama kolom suhu: 21.5

df.iloc[0, 2] membaca baris 0 dan kolom 2, yaitu kolom suhu_c karena posisi kolom dihitung dari kiri. Pemilihan satu baris penuh dan beberapa baris terpencar dijalankan pada data yang sudah tersimpan.

python Satu baris penuh dan list posisi baris
import pandas as pd

df = pd.read_csv("sensor_log.csv", parse_dates=["waktu"])
print(df.iloc[3])
print(df.iloc[[0, 4, 8]][["waktu", "ruang", "suhu_c"]])
text Keluaran
waktu            2026-01-05 07:45:00
ruang                          Lab B
suhu_c                          22.5
lembap_pct                      67.3
status_sensor                 normal
Name: 3, dtype: object
                waktu        ruang  suhu_c
0 2026-01-05 07:00:00  Ruang Arsip    21.5
4 2026-01-05 08:00:00        Lab A    24.6
8 2026-01-05 09:00:00        Lab A    23.5

Baris ke-3 tampil sebagai Series berlabel Name: 3 karena indeksnya masih angka, dan tabel hasil list posisi menampilkan label indeks 0, 4, dan 8 yang kebetulan sama dengan posisinya. Kesamaan itu hanya terjadi pada indeks bawaan, dan perbedaannya langsung terlihat setelah indeks diganti, misalnya dengan set_index("waktu") pada topik Seleksi dengan loc.

Slice posisi bersifat eksklusif#

Slice pada iloc mengikuti kaidah Python, yaitu ujung bawah ikut dan ujung atas dikeluarkan. Kaidah ini berbeda dari slice label pada loc yang kedua ujungnya ikut, sehingga teks slice yang sama dapat menghasilkan jumlah baris berbeda pada kedua alat. Kontras berikut dijalankan pada data yang sama dengan indeks angka bawaan, tempat label dan posisi kebetulan bertumpuk.

python Slice 0:2 pada loc dan iloc menghasilkan jumlah baris berbeda
import pandas as pd

df = pd.read_csv("sensor_log.csv", parse_dates=["waktu"])
print(df.loc[0:2, ["waktu", "ruang"]])
print("baris loc 0:2 =", len(df.loc[0:2]))
print(df.iloc[0:2][["waktu", "ruang"]])
print("baris iloc 0:2 =", len(df.iloc[0:2]))
text Keluaran
                waktu        ruang
0 2026-01-05 07:00:00  Ruang Arsip
1 2026-01-05 07:15:00        Lab B
2 2026-01-05 07:30:00  Ruang Arsip
baris loc 0:2 = 3
                waktu        ruang
0 2026-01-05 07:00:00  Ruang Arsip
1 2026-01-05 07:15:00        Lab B
baris iloc 0:2 = 2

Teks 0:2 pada loc berarti label 0 sampai label 2 sehingga tiga baris, sedangkan pada iloc berarti posisi 0 dan 1 saja sehingga dua baris. Slice iloc tetap mendukung langkah seperti df.iloc[0:96:24] yang mengambil empat baris tiap 24 posisi, sejalan dengan pemotongan list pada Python.

Perbandingan loc dan iloc#

Perbedaan kedua alat dapat dirangkum dalam satu tabel agar keputusan pemilihan alat menjadi cepat. loc dipakai bila yang diketahui adalah nama label, misalnya stempel waktu bacaan, sedangkan iloc dipakai bila yang diketahui adalah letak baris, misalnya baris pertama dan terakhir dari hasil pengurutan.

Aspeklociloc
Basis pemilihanlabel pada indeks dan nama kolomposisi bilangan bulat
Ujung sliceinklusif di kedua ujungeksklusif pada ujung atas
Pemilih baris yang sahlabel, list label, slice label, mask booleanbilangan bulat, list, slice, tuple berlangkah
Hasil satu pemilihSeries satu baris atau satu kolomSeries satu baris atau satu kolom
Kesalahan yang munculKeyError untuk label tak dikenalIndexError untuk posisi di luar jangkauan

Tabel ini juga menjelaskan mengapa dua topik yang membahas keduanya dipisah. Mencampur kerangka berpikir label dan posisi dalam satu ekspresi hampir selalu tanda alat yang salah dipilih.

Aksesor at dan iat#

at dan iat adalah pasangan aksesor ringkas untuk mengambil satu nilai saja, dengan at berbasis label dan iat berbasis posisi. Keduanya tidak menerima slice maupun list, sehingga kegunaannya persis satu sel, dan eksekusinya lebih langsung daripada loc atau iloc yang harus menangani bentuk pemilih umum.

python Mengambil satu sel dengan at dan iat
import pandas as pd

df = pd.read_csv("sensor_log.csv", parse_dates=["waktu"])
dfw = df.set_index("waktu")
print(df.at[0, "suhu_c"])
print(df.iat[0, 2])
print(dfw.at[pd.Timestamp("2026-01-05 07:15"), "suhu_c"])
text Keluaran
21.5
21.5
21.8

Ketiga ekspresi menghasilkan satu nilai: at dengan label baris 0 dan kolom suhu_c, iat dengan posisi yang sama, lalu at pada indeks waktu yang sudah diganti. Gunakan at dan iat hanya untuk akses satu sel yang sering diulang, dan tetap gunakan loc atau iloc untuk pemilihan umum.

Kesalahan umum#

Kesalahan pertama adalah memberikan label kepada iloc atau sebaliknya. iloc dengan kunci string langsung ditolak, sedangkan loc dengan angka pada indeks waktu mencari label 0 yang memang tidak ada.

python Alat yang salah untuk jenis pemilihnya
import pandas as pd

df = pd.read_csv("sensor_log.csv", parse_dates=["waktu"])
dfw = df.set_index("waktu")
try:
    df.iloc["0"]
except TypeError as e:
    print(type(e).__name__, str(e))
try:
    dfw.loc[0]
except KeyError as e:
    print(type(e).__name__, str(e))
text Keluaran
TypeError Cannot index by location index with a non-integer key
KeyError 0

Perbaikannya adalah mencocokkan alat dengan jenis pemilihnya, yaitu df.iloc[0] untuk posisi atau dfw.loc["2026-01-05 07:15"] untuk label waktu. Kesalahan kedua adalah meminta posisi di luar jangkauan data, misalnya df.iloc[96] pada data 96 baris, yang menghasilkan IndexError: single positional indexer is out-of-bounds. Ingat bahwa posisi terakhir adalah 95, dan posisi negatif seperti df.iloc[-1] sah karena dihitung dari belakang sebagaimana list Python. Kesalahan ketiga adalah menganggap slice iloc inklusif setelah terbiasa dengan loc, sehingga baris ujung atas hilang tanpa pesan apa pun. Uji hasil seleksi dengan len pada saat pertama kali menulis batas barunya.

Ringkasan#

  • df.iloc[baris, kolom] memilih berdasarkan posisi bilangan bulat nol basis, terlepas dari isi indeks.
  • Slice iloc eksklusif pada ujung atas, berlawanan dengan slice loc yang inklusif di kedua ujung.
  • at dan iat mengambil satu sel melalui label dan posisi, tanpa dukungan list maupun slice.
  • Pemilih yang tidak cocok dengan alatnya berakhir TypeError pada iloc dan KeyError pada loc, sedangkan posisi di luar jangkauan berakhir IndexError.

Referensi#