pythonpandasapplyMenengah5 mnt baca

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

python
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

python
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) dan pd.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.

python
df["omzet"] = df.apply(lambda r: r["harga"] * r["qty"], axis=1)  # lambat

BENAR: operasi kolom langsung, vectorized dan instan.

python
df["omzet"] = df["harga"] * df["qty"]

SALAH: lupa axis=1 sehingga fungsi menerima kolom, bukan baris.

python
df.apply(diskon)  # diskon menerima Series kolom, hasilnya ngaco

BENAR: 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.