Alternatif iterrows yang Lebih Cepat di Pandas
TL;DR
Alternatif iterrows yang lebih cepat di pandas, dari yang tercepat: vektorisasi lewat operasi kolom langsung, lalu apply, lalu itertuples kalau kamu memang harus loop. iterrows lambat karena ngubah tiap baris jadi Series di tiap putaran. itertuples bisa sekitar 10 kali lebih cepat dari iterrows, dan vektorisasi bisa ratusan kali lebih cepat buat hasil yang sama.
Alternatif iterrows yang lebih cepat di pandas, dari yang tercepat: vektorisasi lewat operasi kolom, lalu apply, lalu itertuples kalau kamu memang harus loop. iterrows sendiri hampir selalu pilihan paling lambat.
iterrows nyaman ditulis. Sintaksnya gampang dibaca, mirip loop biasa. Tapi begitu datamu tembus puluhan ribu baris, dia jadi biang lambat yang bikin kamu nunggu tiap kali kode jalan.
Kabar baiknya, hampir semua kerjaan iterrows bisa dipindah ke cara yang lebih cepat. Tinggal tau mana yang pas buat kasusmu.
Kenapa iterrows lambat?
iterrows ngubah tiap baris jadi object Series baru di tiap putaran. Bikin Series itu mahal, dan diulang buat tiap baris. Di 100.000 baris, ongkosnya numpuk jadi hitungan detik yang kerasa banget waktu eksplorasi.
Ada masalah kedua: tipe data bisa berubah. Kalau satu baris nyampur angka dan teks, Series maksa semua jadi satu tipe, dan itu kadang bikin bug halus. Buat gambaran lengkap perbandingan loop dan vektor, baca vektorisasi vs loop di pandas.
Alternatif 1: vektorisasi (tercepat)
Vektorisasi ngerjain operasi ke seluruh kolom sekaligus, tanpa loop. Ini selalu pilihan pertama. Kalau logikamu cuma aritmetika atau kondisi antar kolom, kamu nggak butuh loop sama sekali.
import numpy as np
# Ganti loop iterrows jadi operasi kolom
df['total'] = df['qty'] * df['harga']
# Logika kondisi pakai np.where
df['label'] = np.where(df['total'] > 1_000_000, 'besar', 'kecil')
Cara ini mroses data di level C, jauh di bawah Python, jadi bisa ratusan kali lebih cepat. Ngubah bentuk kolom kayak gini bagian dari data transformation yang rutin.
Alternatif 2: apply (buat logika yang lebih rumit)
Kalau logikanya terlalu kompleks buat operasi kolom, apply lebih rapi dari loop manual. Tapi ingat, apply(axis=1) tetap jalan baris per baris di balik layar, jadi cuma sekitar 2 sampai 3 kali lebih cepat dari iterrows.
def kategori(row):
if row['total'] > 1_000_000 and row['kota'] == 'Jakarta':
return 'prioritas'
return 'biasa'
df['kategori'] = df.apply(kategori, axis=1)
Pakai apply kalau vektorisasi beneran nggak memungkinkan. Detailnya ada di pandas apply.
Alternatif 3: itertuples (kalau harus loop)
Kadang kamu memang harus loop, misalnya tiap baris manggil fungsi eksternal. Buat kasus itu, itertuples jauh lebih baik dari iterrows. Dia ngasih tiap baris sebagai named tuple yang murah dibikin, biasanya sekitar 10 kali lebih cepat.
# iterrows: lambat
for idx, row in df.iterrows():
kirim_notif(row['email'], row['total'])
# itertuples: jauh lebih cepat
for row in df.itertuples():
kirim_notif(row.email, row.total)
Bedanya cuma cara akses: itertuples pakai titik (row.email), bukan kurung siku. Ganti kecil, cepatnya kerasa.
Alternatif 4: zip antar kolom
Buat loop sederhana di beberapa kolom, ngezip kolom langsung juga cepat dan gampang dibaca. Ini sering lebih kilat dari itertuples buat kasus ringan.
hasil = []
for qty, harga in zip(df['qty'], df['harga']):
hasil.append(qty * harga)
df['total'] = hasil
zip ngambil nilai mentah tiap kolom tanpa bungkus object baru, jadi ongkosnya kecil.
Perbandingan kecepatan
Buat operasi kali dua kolom di 100.000 baris, urutannya kira-kira begini:
| Metode | Waktu (100.000 baris) | Relatif ke iterrows |
|---|---|---|
| iterrows() | ~3.000 ms | 1x |
| apply(axis=1) | ~900 ms | ~3x lebih cepat |
| itertuples() | ~250 ms | ~12x |
| zip antar kolom | ~90 ms | ~33x |
| vektorisasi | ~5 ms | ~600x |
Angka pastinya beda per mesin, tapi urutannya konsisten. Vektor paling cepat, iterrows paling lambat.
Contoh kasus: kirim struk 80.000 transaksi Toko Berkah
Toko Berkah, UMKM di dataset latihan ngulikdata, mau ngirim struk digital ke pelanggan dari 80.000 baris transaksi. Bagian hitung totalnya bisa divektorkan, tapi bagian kirim emailnya harus loop karena manggil layanan eksternal.
Versi awal pakai iterrows buat semuanya, makan 6,4 detik cuma buat nyiapin data sebelum kirim. Setelah hitung total dipindah ke vektorisasi dan loop kirimnya ganti itertuples, tahap persiapan turun ke 0,4 detik. Enam belas kali lebih cepat, dari satu perubahan pola.
Pelajarannya: pisahin bagian yang bisa divektorkan dari bagian yang harus loop. Jarang seluruh kerjaan harus loop.
Kesalahan umum
1. Pakai iterrows padahal bisa divektorkan
Kalau isi loop cuma hitungan antar kolom, kamu nggak butuh loop. Pindah ke operasi kolom atau np.where.
2. Append ke DataFrame di dalam loop
Nambah baris satu-satu ke DataFrame bikin pandas nyalin ulang seluruh data tiap iterasi. Kumpulin ke list dulu, baru bikin DataFrame sekali.
3. Ganti ke itertuples tapi masih akses pakai kurung
itertuples ngasih named tuple, jadi aksesnya row.kolom, bukan row['kolom']. Salah akses bikin error.
4. Nganggep apply pasti cepat
apply lebih rapi, tapi tetap loop di balik layar. Jangan harap dia secepat vektorisasi. Bagian pembersihan data juga sering lebih ringkas tanpa loop, lihat data cleaning.
Buat catatan resmi soal iterasi di pandas, cek dokumentasi iteration di pandas.
FAQ
Kenapa iterrows lambat banget?
iterrows ngubah tiap baris jadi object Series baru tiap putaran sebelum kamu bisa akses nilainya. Pembuatan Series itu mahal, dan diulang buat tiap baris. Di data 100 ribu baris, ongkosnya numpuk jadi hitungan detik. Selain itu, tipe data per kolom bisa berubah pas jadi Series, yang kadang bikin bug halus. Itu sebabnya iterrows dihindari buat data besar.
Apa alternatif iterrows yang paling cepat?
Vektorisasi, yaitu operasi langsung ke kolom tanpa loop sama sekali. Misalnya df['total'] = df['qty'] * df['harga']. Cara ini mroses seluruh kolom di level C dan bisa ratusan kali lebih cepat dari iterrows. Kalau logikamu bisa ditulis sebagai operasi kolom atau np.where, itu selalu pilihan pertama sebelum mikirin loop bentuk apa pun.
Apa beda itertuples dan iterrows?
itertuples ngasih tiap baris sebagai named tuple, bukan Series. Bikin tuple jauh lebih murah daripada bikin Series, jadi itertuples biasanya sekitar 10 kali lebih cepat dari iterrows. Aksesnya pakai titik, misalnya row.harga, bukan row['harga']. Kalau kamu memang harus loop dan nggak bisa divektorkan, itertuples hampir selalu pilihan yang lebih baik dari iterrows.
Kapan aku masih boleh pakai iterrows?
iterrows masih oke buat data kecil, di bawah beberapa ribu baris, di mana kecepatan nggak kerasa. Cocok juga buat prototipe cepat atau waktu kamu butuh baca kode yang gampang dipahami. Tapi begitu datanya membesar atau loop-nya jalan berulang, ganti ke itertuples atau vektorisasi. Buat produksi, hindari iterrows di data besar.
Apakah apply lebih cepat dari iterrows?
Biasanya iya, tapi bedanya nggak sebesar yang orang kira. apply(axis=1) tetap jalan baris per baris di balik layar, cuma sintaksnya lebih rapi. Dia sekitar 2 sampai 3 kali lebih cepat dari iterrows, tapi masih jauh lebih lambat dari vektorisasi. Pakai apply kalau logikamu terlalu kompleks buat operasi kolom, tapi cek dulu apakah beneran nggak bisa divektorkan.
Penutup
- Urutan dari tercepat: vektorisasi, zip antar kolom, itertuples, apply, baru iterrows.
- Coba vektorisasi dulu. Loop cuma buat bagian yang beneran nggak bisa divektorkan.
- Kalau harus loop, ganti iterrows ke itertuples buat percepatan gratis sekitar 10 kali.
Coba sekarang: cari satu iterrows di kodemu, ukur waktunya, lalu ganti ke itertuples atau vektorisasi. Bandingin angkanya sendiri.
Mau agregasi cepat tanpa loop? Baca pandas groupby buat ngerangkum data per kelompok dalam satu baris.
Mau praktek langsung? Mulai latihan SQL gratis
Latihan interaktif, langsung di browser.
Artikel terkait
NumPy reshape: Ubah Bentuk Array (2026)
Fungsi reshape di NumPy ngatur ulang bentuk array tanpa ngubah datanya. Ini cara pakainya, arti angka -1, dan cara ngeflat array.
NumPy Array: Dasar-Dasar untuk Analis Data (2026)
NumPy array bikin hitungan data di Python jauh lebih cepat dari list biasa. Ini dasar bikin, slicing, dan operasi array buat analis.
Vektorisasi vs Loop di Pandas: Mana Lebih Cepat
Loop iterrows di data 100 ribu baris bisa makan 3 detik. Versi vektornya kelar di bawah 5 milidetik. Ini cara ubah loop lambat jadi operasi kolom yang ngebut.