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.
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])sel pertama kolom suhu: 21.5df.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.
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"]])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.5Baris 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.
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])) 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 = 2Teks 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.
| Aspek | loc | iloc |
|---|---|---|
| Basis pemilihan | label pada indeks dan nama kolom | posisi bilangan bulat |
| Ujung slice | inklusif di kedua ujung | eksklusif pada ujung atas |
| Pemilih baris yang sah | label, list label, slice label, mask boolean | bilangan bulat, list, slice, tuple berlangkah |
| Hasil satu pemilih | Series satu baris atau satu kolom | Series satu baris atau satu kolom |
| Kesalahan yang muncul | KeyError untuk label tak dikenal | IndexError 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.
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"])21.5
21.5
21.8Ketiga 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.
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))TypeError Cannot index by location index with a non-integer key
KeyError 0Perbaikannya 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
iloceksklusif pada ujung atas, berlawanan dengan slicelocyang inklusif di kedua ujung. atdaniatmengambil satu sel melalui label dan posisi, tanpa dukungan list maupun slice.- Pemilih yang tidak cocok dengan alatnya berakhir
TypeErrorpadailocdanKeyErrorpadaloc, sedangkan posisi di luar jangkauan berakhirIndexError.
Referensi#
- pandas.DataFrame.iloc — pandas API reference — dokumentasi resmi aksesor iloc dan aturan pemilihan berbasis posisi.
- Indexing and selecting data — pandas User Guide — bab resmi yang membandingkan seleksi berbasis label dan berbasis posisi.