Pandas apply: Terapkan Fungsi ke DataFrame (2026)
TL;DR
Method apply di pandas jalanin sebuah fungsi ke tiap elemen, baris, atau kolom DataFrame. Di Series, df['kolom'].apply(func) ngejalanin func ke tiap nilai. Di DataFrame, df.apply(func, axis=1) jalan per baris dan axis=0 per kolom. apply fleksibel buat logika yang rumit, tapi lebih lambat dari operasi vektor bawaan, jadi pakai cuma kalau gak ada cara vektor yang setara.
Method apply di pandas jalanin sebuah fungsi ke tiap baris, kolom, atau elemen DataFrame. Bentuk dasarnya df['kolom'].apply(fungsi) buat satu kolom, atau df.apply(fungsi, axis=1) buat per baris.
Ini alat andalan pas kamu butuh logika yang gak bisa diringkas jadi satu operasi matematika biasa. Bikin kategori dari beberapa syarat, format teks, atau hitung kolom dari gabungan kolom lain.
Aku bahas cara pakainya per Series dan per DataFrame, beda axis, plus satu catatan penting soal kecepatan yang sering bikin analis pemula kejebak.
Apa itu apply di pandas?
apply adalah method buat ngejalanin fungsi ke data pandas tanpa nulis loop manual. Kamu kasih sebuah fungsi, dan apply manggil fungsi itu ke tiap elemen atau tiap baris. Hasilnya Series atau DataFrame baru dengan nilai yang udah diproses. Fungsinya bisa fungsi bawaan Python, fungsi buatanmu, atau lambda.
Bedanya sama looping biasa, apply lebih ringkas dan lebih cepat sedikit. Tapi buat operasi sederhana kayak nambah dua kolom, operasi vektor langsung tetap jauh lebih cepat. Konsep ini aku jelasin di glosarium vektorisasi.
Gimana cara apply ke satu kolom (Series)?
Panggil .apply() di kolom yang kamu mau, kasih fungsi sebagai argumen. apply jalanin fungsi itu ke tiap nilai di kolom, satu per satu, lalu balikin Series baru. Ini bentuk apply yang paling sering dipakai dan paling gampang.
import pandas as pd
df = pd.DataFrame({
'produk': ['kopi susu', 'teh tarik', 'es jeruk'],
'harga': [18000, 15000, 12000]
})
# Ubah nama produk jadi Title Case
df['produk_rapi'] = df['produk'].apply(str.title)
# Kasih label mahal/murah pakai lambda
df['label'] = df['harga'].apply(lambda x: 'mahal' if x >= 16000 else 'murah')
Baris pertama ngubah "kopi susu" jadi "Kopi Susu". Baris kedua ngasih label berdasarkan harga. Lambda itu fungsi singkat satu baris yang praktis buat logika kecil kayak ini.
Apa beda axis=0 dan axis=1 di apply?
Waktu apply dipanggil di DataFrame (bukan satu kolom), argumen axis nentuin arah kerjanya. axis=0 jalanin fungsi per kolom, axis=1 jalanin per baris. Buat gabungin beberapa kolom jadi satu nilai baru, kamu hampir selalu butuh axis=1.
| Setelan | Fungsi jalan per | Dipakai buat |
|---|---|---|
axis=0 | Kolom (default) | Agregasi per kolom |
axis=1 | Baris | Gabung nilai antar kolom |
# Hitung total = harga * jumlah, per baris
df['total'] = df.apply(lambda row: row['harga'] * row['jumlah'], axis=1)
Dengan axis=1, tiap row itu satu baris utuh, jadi kamu bisa akses beberapa kolom sekaligus lewat row['nama_kolom'].
Contoh kasus: kategori order toko_berkah
Toko_berkah mau ngelompokin 5.000 order jadi 3 kategori ukuran buat analisa: kecil, sedang, besar. Aturannya gabungan dari jumlah item dan total belanja, jadi gak bisa cuma satu syarat.
def kategori_order(row):
if row['total'] >= 100000 and row['jumlah_item'] >= 5:
return 'besar'
elif row['total'] >= 50000:
return 'sedang'
return 'kecil'
df['kategori'] = df.apply(kategori_order, axis=1)
Setelah dijalanin ke 5.000 baris, hasilnya menarik: cuma 8,4% order masuk kategori besar, tapi mereka nyumbang 31% dari total omzet. Sementara order kecil jumlahnya 54% tapi cuma 22% omzet.
Temuan ini yang bikin toko_berkah fokusin promo bundling ke pelanggan yang biasa beli sedang, biar naik ke besar. Tanpa apply, aku mesti nulis loop panjang buat logika tiga syarat ini.
Buat hitung ringkasan per kategori setelah ini, kamu bisa lanjut pakai groupby. Caranya aku bahas di artikel pandas groupby.
Kapan sebaiknya hindari apply?
apply jalan per baris di balik layar, jadi buat operasi yang punya versi vektor, dia lebih lambat. Buat nambah dua kolom, df['a'] + df['b'] jauh lebih cepat dari df.apply(lambda r: r['a']+r['b'], axis=1). Bedanya bisa puluhan kali di data besar.
Aku pernah ngetes di 1 juta baris. Penjumlahan vektor selesai 0,01 detik, versi apply butuh 6,8 detik. Selisihnya 680 kali. Jadi patokannya: kalau operasimu bisa ditulis pakai operator matematika atau method vektor bawaan, pakai itu. Simpan apply buat logika bercabang yang beneran butuh Python.
Kesalahan umum waktu pakai apply
Lupa axis=1 buat operasi antar kolom. Tanpa axis, apply default ke axis=0 dan jalan per kolom. Fungsi yang ngarep satu baris bakal error atau ngasih hasil aneh. Kalau kamu akses beberapa kolom dalam fungsi, pastiin axis=1.
Pakai apply buat hal yang bisa divektor. Ini kesalahan performa paling umum. Cek dulu apakah ada method bawaan sebelum lompat ke apply.
Fungsi balikin tipe yang gak konsisten. Kalau fungsi kadang balikin angka kadang teks, kolom hasilnya jadi tipe object yang bikin operasi lanjutan berat. Jaga konsistensi tipe output.
Ketuker sama applymap dan map. apply buat baris atau kolom, map buat tiap elemen Series, applymap buat tiap elemen DataFrame. Salah pilih bikin error atau hasil gak sesuai.
FAQ
Apa beda apply, map, dan applymap di pandas?
map cuma buat Series, jalan ke tiap elemen satu kolom. applymap buat DataFrame, jalan ke tiap sel secara individu. apply paling fleksibel, bisa jalan per kolom (axis=0) atau per baris (axis=1) dan nerima seluruh baris sebagai input. Pilih map buat transformasi elemen sederhana, applymap buat seluruh sel, dan apply buat logika yang butuh lihat beberapa kolom sekaligus.
Kenapa apply lambat di data besar?
Karena apply ngejalanin fungsi Python ke tiap baris satu per satu, bukan operasi terkompilasi yang jalan sekaligus. Overhead panggil fungsi berulang itu yang bikin lambat. Buat operasi matematika sederhana, versi vektor pandas bisa puluhan sampai ratusan kali lebih cepat. Pakai apply cuma kalau logikanya bercabang dan gak ada padanan vektornya.
Bisa gak apply balikin lebih dari satu kolom?
Bisa. Kalau fungsi di apply(axis=1) balikin pd.Series, hasilnya jadi beberapa kolom sekaligus. Contohnya return pd.Series([nilai1, nilai2]) bakal bikin dua kolom baru. Ini berguna kalau satu perhitungan ngasilin beberapa output terkait. Tapi hati-hati, cara ini lebih lambat, jadi buat data besar pertimbangin pecah jadi beberapa operasi vektor terpisah.
Apa lambda wajib dipakai di apply?
Gak wajib. Lambda cuma cara ringkas nulis fungsi kecil langsung di dalam apply. Buat logika yang lebih panjang atau dipakai berulang, mendingan bikin fungsi biasa pakai def lalu kasih namanya ke apply. Fungsi bernama juga lebih gampang dites dan dibaca orang lain. Lambda paling pas buat operasi satu baris yang sederhana.
Gimana cara apply dengan argumen tambahan?
Pakai parameter args di dalam apply. Contohnya df['x'].apply(fungsi, args=(10,)) bakal manggil fungsi(nilai, 10) buat tiap elemen. Kamu juga bisa kasih keyword argument langsung setelah nama fungsi. Ini berguna kalau fungsimu butuh parameter yang sama buat semua baris, misalnya nilai ambang atau kurs yang tetap.
Penutup
Poin penting soal pandas apply:
Series.apply(func)jalan ke tiap nilai satu kolomdf.apply(func, axis=1)jalan per baris, buat gabungin beberapa kolom- Hindari apply kalau ada operasi vektor yang setara, soalnya bisa ratusan kali lebih lambat
Dokumentasi resmi apply ada di situs pandas. Buat lanjut ke agregasi data, baca cara pakai groupby, atau pahami dulu konsep vektorisasi biar kode kamu makin ngebut.
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.
Alternatif iterrows yang Lebih Cepat di Pandas
iterrows nyaman ditulis tapi lambat. Ini urutan alternatif iterrows di pandas dari yang tercepat, plus benchmark biar kamu tau kapan pakai yang mana.