TL;DR
Di pandas, loc nyeleksi data berdasarkan label (nama index dan nama kolom), sedangkan iloc berdasarkan posisi angka (0, 1, 2). Beda penting: slicing loc ikut nilai akhir, slicing iloc nggak. Pakai loc kalau kamu tau nama barisnya, iloc kalau tau urutan posisinya.
Di pandas, loc nyeleksi data pakai label, sedangkan iloc pakai posisi angka. Itu beda inti yang bikin dua-duanya sering ketuker.
loc nanya "baris dengan label apa?". iloc nanya "baris di posisi ke berapa?". Kelihatan mirip, tapi hasilnya bisa beda jauh, apalagi pas slicing.
Di artikel ini kamu bakal tau kapan pakai yang mana, kenapa slicing keduanya beda, dan kesalahan yang paling sering bikin KeyError atau data salah ambil.
loc milih data berdasarkan label, yaitu nama index dan nama kolom. iloc milih berdasarkan posisi integer, mulai dari 0. Kalau index DataFrame kamu masih angka default 0, 1, 2, hasil keduanya sering keliatan sama. Bedanya baru kerasa pas index-nya berupa teks atau slicing.
| Aspek | loc | iloc |
|---|---|---|
| Basis seleksi | Label (nama) | Posisi (angka) |
| Contoh baris | df.loc['budi'] | df.iloc[0] |
| Slicing akhir | Termasuk nilai akhir | Ga termasuk nilai akhir |
| Cocok buat | Index label yang bermakna | Ambil baris per urutan |
loc minta label. Formatnya df.loc[baris, kolom].
import pandas as pd
df = pd.DataFrame({
'nama': ['Budi', 'Sari', 'Andi'],
'kota': ['Bandung', 'Bekasi', 'Bogor'],
'omzet': [120, 90, 150]
}, index=['a', 'b', 'c'])
# Satu baris berdasarkan label index
df.loc['a']
# Baris 'a', kolom 'omzet'
df.loc['a', 'omzet'] # 120
# Beberapa baris dan kolom
df.loc[['a', 'c'], ['nama', 'omzet']]
loc juga bisa dipadu sama kondisi boolean, ini yang paling sering kepakai buat filter:
# Semua baris dengan omzet di atas 100
df.loc[df['omzet'] > 100]
Buat filter baris yang lebih dalam, cek panduan groupby pandas yang sering dipakai bareng loc.
iloc minta posisi angka, mulai 0. Formatnya df.iloc[baris, kolom].
# Baris pertama (posisi 0)
df.iloc[0]
# Baris posisi 0, kolom posisi 2
df.iloc[0, 2] # 120
# Tiga baris pertama
df.iloc[0:3]
# Baris posisi 0 dan 2, kolom posisi 0 dan 2
df.iloc[[0, 2], [0, 2]]
iloc ga peduli label index. Walau index kamu berupa teks 'a', 'b', 'c', iloc[0] tetap ngambil baris paling atas. Ini yang bikin dia aman buat ngambil "baris ke-n" tanpa mikirin nama.
Ini bagian paling sering bikin bug. Slicing loc ikut nilai akhir. Slicing iloc nggak, sama kayak slicing list Python biasa.
# Index angka 0..4
df2 = pd.DataFrame({'x': [10, 20, 30, 40, 50]})
df2.loc[1:3] # baris 1, 2, 3 (3 baris, akhir ikut)
df2.iloc[1:3] # baris 1, 2 (2 baris, akhir ga ikut)
Perhatiin. loc[1:3] ngasih 3 baris, iloc[1:3] cuma 2. Bedanya di apakah nilai akhir dihitung. Salah paham soal ini bikin kamu kelebihan atau kekurangan satu baris tanpa sadar.
Di dataset toko_berkah ngulikdata ada DataFrame 14.880 baris transaksi, index-nya kode transaksi berupa teks kayak TRX-00001. Ada dua kebutuhan beda.
Pertama, ambil transaksi dengan kode spesifik. Karena index-nya label, pakai loc:
df.loc['TRX-00042']
Kedua, ambil 10 transaksi teratas buat cek cepat isi data. Karena ini soal posisi, pakai iloc:
df.iloc[0:10]
Waktu aku ngetes di dataset ini, nyoba df.loc[0] langsung keluar KeyError, karena ga ada baris berlabel angka 0. Index-nya teks semua. Kasus kayak gini yang bikin orang bingung kenapa loc error padahal barisnya jelas ada. Jawabannya: label ga cocok. Buat gabungin data transaksi sebelum diseleksi, biasanya lewat pandas merge dulu.
df.loc[0] error kalau ga ada label 0. Pakai iloc buat posisi.loc[1:3] ikut akhir, iloc[1:3] nggak. Ini beda satu baris.df[df['x'] > 0]['y'] = 1 bisa munculin SettingWithCopyWarning. Pakai df.loc[df['x'] > 0, 'y'] = 1 yang lebih aman.df.iloc['a'] error, karena iloc cuma terima angka posisi.Pakai loc kalau kamu tau nama baris atau kolomnya, misalnya index berupa kode atau tanggal yang bermakna. Pakai iloc kalau kamu cuma peduli posisi, misalnya ambil 5 baris pertama buat ngintip data. Aturan gampangnya: label pakai loc, angka posisi pakai iloc.
Karena loc nyari label, bukan posisi. Kalau index DataFrame kamu berupa teks atau angka yang bukan 0, maka label 0 ga ada dan pandas keluar KeyError. Kalau maksud kamu ambil baris pertama, pakai df.iloc[0] yang berbasis posisi, bukan loc.
Bedanya kecil dan jarang kerasa di kerjaan harian. Buat data biasa, pilih berdasarkan kejelasan kode, bukan kecepatan. loc bikin kode lebih kebaca kalau labelnya bermakna. iloc pas buat akses per posisi. Optimasi kecepatan mendingan dari cara lain, bukan dari milih antara keduanya.
Bisa, dan malah disaranin. Nulis df.loc[kondisi, 'kolom'] = nilai adalah cara yang bener buat update data terfilter, tanpa munculin SettingWithCopyWarning. Hindari chained indexing kayak df[kondisi]['kolom'] = nilai karena hasilnya ga selalu ke-assign ke DataFrame asli.
loc pakai label, iloc pakai posisi. Ingat satu jebakan besar: slicing loc ikut nilai akhir, iloc nggak. Sekali paham ini, kamu ga bakal salah ambil baris lagi.
Buat filter dan update data, biasakan pakai df.loc[kondisi, 'kolom'] supaya aman dari warning.
Mau lanjut olah data pandas? Baca Pandas groupby dan latihan konsep data di Ngulik Data. Referensi resmi ada di dokumentasi indexing pandas.
Mau praktek langsung? Mulai latihan SQL gratis
Latihan interaktif, langsung di browser.
Nama toko ketik campur huruf besar-kecil, spasi nyasar di ujung, atau kode produk nempel jadi satu. Accessor .str di pandas ngerapiin semua itu tanpa loop.
Model machine learning cuma ngerti angka, bukan teks kayak merah atau biru. get_dummies ngubah kolom kategori jadi kolom 0/1 dalam satu baris kode.
Cara pakai pandas crosstab buat bikin tabel silang yang menghitung frekuensi antar dua kategori. Contoh analisis kategori produk per kota UMKM.