apply() dan lambda di pandas
Pelajari apply() dengan fungsi lambda dan fungsi biasa, pahami kapan apply boleh dipakai, dan kapan kamu harus beralih ke operasi vectorized yang jauh lebih cepat.
apply(): Pisau Lipat Serbaguna (yang Lambat)
apply() seperti menyuruh satu orang mengerjakan tugas baris per baris: fleksibel untuk logika apa pun, tapi lambat kalau datanya sejuta baris. Operasi vectorized (operasi langsung di seluruh kolom) seperti mesin pabrik: kaku tapi super cepat. Analogi sederhananya, kalau kamu cuma butuh menjumlahkan dua kolom, jangan suruh orang menjumlahkan satu per satu.
Untuk data analyst, apply() penting karena tidak semua logika bisnis bisa diungkapkan sebagai operasi kolom sederhana. Aturan kategorisasi bertingkat, parsing teks tidak beraturan, atau scoring dengan banyak kondisi, semuanya nyaman ditulis sebagai fungsi lalu di-apply. Tapi analis yang baik tahu kapan harus berhenti memakai apply dan beralih ke cara vectorized.
apply() dengan lambda dan Fungsi Biasa
import pandas as pd
df = pd.DataFrame({
"produk": ["Kopi", "Teh", "Susu", "Kopi Susu"],
"harga": [15000, 8000, 12000, 18000],
})
# lambda untuk logika satu baris
df["kelas_harga"] = df["harga"].apply(
lambda x: "Murah" if x < 10000 else "Mahal"
)
# fungsi biasa untuk logika yang lebih panjang
def label_produk(nama):
if "Kopi" in nama:
return "Berkafein"
return "Non-kafein"
df["label"] = df["produk"].apply(label_produk)
print(df)lambda cocok untuk logika satu baris yang sederhana. Kalau logikanya bercabang banyak atau butuh dibaca orang lain, tulis fungsi biasa dengan nama yang jelas, lalu apply fungsi itu. Kode yang bisa dibaca enam bulan dari sekarang lebih berharga dari kode yang pendek.
Kapan apply() Boleh, Kapan Harus Vectorized
import pandas as pd
import numpy as np
df = pd.DataFrame({"harga": [15000, 8000, 12000, 18000],
"qty": [2, 1, 3, 1]})
# Boleh: logika kompleks per baris (multi-kolom butuh axis=1)
def diskon(row):
if row["harga"] > 15000 and row["qty"] >= 2:
return 0.1
if row["harga"] > 10000:
return 0.05
return 0.0
df["diskon"] = df.apply(diskon, axis=1)
# Wajib vectorized: operasi aritmetika sederhana
df["omzet"] = df["harga"] * df["qty"] # JANGAN pakai apply di sini
df["kelas"] = np.where(df["harga"] < 10000, "Murah", "Mahal")
print(df)Aturannya: apply boleh untuk logika kompleks yang melibatkan banyak kondisi atau banyak kolom sekaligus (jangan lupa axis=1 untuk mode per baris). Tapi untuk aritmetika, perbandingan, atau pilihan biner sederhana, operasi vectorized bisa puluhan kali lebih cepat di data besar.
Catatan teknis:
np.where(kondisi, a, b)danpd.cut()adalah dua senjata vectorized paling sering dipakai.pd.cut(df["harga"], bins=[0, 10000, 20000], labels=["Murah", "Mahal"])menggantikan apply kategorisasi dalam sekejap.
Jebakan Umum
SALAH: memakai apply untuk perkalian dua kolom.
df["omzet"] = df.apply(lambda r: r["harga"] * r["qty"], axis=1) # lambatBENAR: operasi kolom langsung, vectorized dan instan.
df["omzet"] = df["harga"] * df["qty"]SALAH: lupa axis=1 sehingga fungsi menerima kolom, bukan baris.
df.apply(diskon) # diskon menerima Series kolom, hasilnya ngacoBENAR: df.apply(diskon, axis=1) kalau fungsimu dirancang menerima satu baris (row). Default apply berjalan per kolom (axis=0).
Tantangan
Kategorikan Produk dengan apply
Diberikan DataFrame produk (nama, harga). Buat fungsi kategorisasi: harga di bawah 10000 jadi 'Ekonomis', 10000 sampai 15000 jadi 'Standar', di atasnya 'Premium'. Terapkan dengan apply dan lambda, lalu buat kolom yang sama dengan pd.cut sebagai perbandingan.