Lambda adalah fungsi tanpa nama yang ditulis dalam satu baris: parameter di sebelah kiri, satu ekspresi di sebelah kanan kata kunci lambda. Dalam pekerjaan pandas sehari-hari, kita sering membutuhkan transformasi kecil sekali pakai, misalnya memformat angka menjadi teks Rupiah, memberi label pada transaksi besar, atau menghitung ongkir dengan aturan sederhana. Menulis fungsi def lengkap untuk kebutuhan sesaat membuat kode tersebar dan mengurangi keterbacaan. Pada Chapter ini kita mempraktikkan empat pola pemakaian lambda bersama map(), assign(), dan apply() pada satu dataset pesanan toko yang sama.

Sintaks Lambda dalam Satu Baris #

Ekspresi lambda t: t * 2 mendefinisikan fungsi yang menerima satu nilai t dan mengembalikan hasil t * 2. Bentuk def yang setara membutuhkan beberapa baris: deklarasi fungsi, badan fungsi, dan pernyataan return. Lambda hanya menerima satu ekspresi tunggal; hasil ekspresi tersebut otomatis menjadi return value, sehingga di dalam lambda tidak ada return, tidak ada print(), dan tidak ada blok multi-baris. Batasan inilah yang membuat lambda cocok untuk transformasi ringkas dan tidak cocok untuk logika panjang.

Pandas tidak memberi perlakuan khusus pada lambda; pandas menerima objek callable apa pun pada Series.map() dan DataFrame.apply() . Lambda hanyalah cara paling ringkas untuk menyediakan callable tersebut. Karena itu, keempat pola pada Chapter ini juga bisa dipakai dengan fungsi bernama def bila logikanya lebih kompleks.

Empat Pola Lambda pada Dataset Pesanan #

Skrip berikut memakai dataset pesanan toko untuk memperagakan empat pola: memformat nilai transaksi menjadi teks Rupiah, menambah kolom diskon bersyarat lewat assign(), menghitung ongkir antar kolom lewat apply(), dan menyaring transaksi besar. Jalankan skripnya, lalu bandingkan keempat blok cetakan dengan uraian baris-per-baris di bawah.

python
import pandas as pd

pesanan = pd.DataFrame({
    "id_pesanan": ["PSN-001", "PSN-002", "PSN-003", "PSN-004",
                   "PSN-005", "PSN-006", "PSN-007", "PSN-008"],
    "nama_pelanggan": ["Budi", "Siti", "Dewi", "Andi",
                       "Rina", "Tono", "Lina", "Sari"],
    "kota": ["Jakarta", "Bandung", "Surabaya", "Jakarta",
             "Medan", "Bandung", "Jakarta", "Surabaya"],
    "pembayaran": ["QRIS", "Transfer", "QRIS", "Kartu Kredit",
                   "COD", "Transfer", "QRIS", "COD"],
    "nilai_transaksi": [250_000, 1_800_000, 750_000, 2_400_000,
                        480_000, 1_200_000, 320_000, 980_000],
    "berat_paket": [1.2, 4.5, 0.8, 7.0, 2.5, 3.0, 1.0, 5.5],
})

format_rupiah = pesanan["nilai_transaksi"].map(
    lambda t: f"Rp{t:,.0f}".replace(",", ".")
)
print(format_rupiah)
print()

pesanan = pesanan.assign(
    diskon=lambda d: d["nilai_transaksi"].map(
        lambda t: t * 0.10 if t >= 1_000_000 else t * 0.05
    )
)
print(pesanan[["id_pesanan", "nilai_transaksi", "diskon"]])
print()

pesanan["ongkir"] = pesanan.apply(
    lambda r: max(r["berat_paket"] * 10_000, 15_000), axis=1
)
print(pesanan[["id_pesanan", "berat_paket", "ongkir"]])
print()

besar = pesanan[pesanan["nilai_transaksi"].map(lambda t: t > 1_000_000)]
print(besar[["id_pesanan", "nama_pelanggan", "nilai_transaksi"]])

Output yang Dihasilkan:

text
0      Rp250.000
1    Rp1.800.000
2      Rp750.000
3    Rp2.400.000
4      Rp480.000
5    Rp1.200.000
6      Rp320.000
7      Rp980.000
Name: nilai_transaksi, dtype: str

  id_pesanan  nilai_transaksi    diskon
0    PSN-001           250000   12500.0
1    PSN-002          1800000  180000.0
2    PSN-003           750000   37500.0
3    PSN-004          2400000  240000.0
4    PSN-005           480000   24000.0
5    PSN-006          1200000  120000.0
6    PSN-007           320000   16000.0
7    PSN-008           980000   49000.0

  id_pesanan  berat_paket   ongkir
0    PSN-001          1.2  15000.0
1    PSN-002          4.5  45000.0
2    PSN-003          0.8  15000.0
3    PSN-004          7.0  70000.0
4    PSN-005          2.5  25000.0
5    PSN-006          3.0  30000.0
6    PSN-007          1.0  15000.0
7    PSN-008          5.5  55000.0

  id_pesanan nama_pelanggan  nilai_transaksi
1    PSN-002           Siti          1800000
3    PSN-004           Andi          2400000
5    PSN-006           Tono          1200000

Mari kita telaah apa yang terjadi pada kode di atas:

  1. Baris 17-19 (pesanan["nilai_transaksi"].map(lambda t: ...)): map() memanggil lambda sekali untuk setiap nilai kolom nilai_transaksi. f-string f"Rp{t:,.0f}" menghasilkan format Amerika seperti Rp1,800,000, lalu .replace(",", ".") mengubah koma pemisah ribuan menjadi titik sehingga hasilnya Rp1.800.000. Hasil map() adalah Series baru bertipe str; dataset asli tidak berubah.
  2. Baris 23-27 (pesanan.assign(...)): method DataFrame.assign() meneruskan DataFrame pesanan ke lambda d, lalu di dalamnya map() kedua menjalankan lambda bersyarat: transaksi 1 juta ke atas mendapat potongan 10 persen, sisanya 5 persen. Ekspresi t * 0.10 if t >= 1_000_000 else t * 0.05 adalah conditional expression Python yang sah di dalam lambda. Kolom diskon bertipe float64 karena dikalikan angka desimal.
  3. Baris 31-33 (pesanan.apply(..., axis=1)): apply() dengan axis=1 mengirim satu baris sebagai Series r pada setiap pemanggilan lambda. Lambda membaca berat_paket dari baris tersebut, mengalikannya dengan tarif 10.000 per kilogram, lalu max(..., 15_000) menetapkan ongkir minimum 15.000. Pola ini dipakai saat perhitungan melibatkan lebih dari satu kolom.
  4. Baris 37 (pesanan[... .map(lambda t: t > 1_000_000)]): map() dengan lambda perbandingan menghasilkan Series boolean, dan Series boolean itu menjadi penyaring baris. Hanya PSN-002, PSN-004, dan PSN-006 yang nilainya di atas 1 juta.

Perhatikan bahwa ketiga lambda memakai nama parameter satu huruf (t, d, r). Konvensi ini lazim untuk lambda pendek karena cakupannya hanya satu baris.

Kapan Memilih Lambda, Kapan def #

Gunakan lambda saat transformasi pendek, jelas dalam satu baris, dan tidak dipakai ulang di tempat lain. Pindah ke fungsi def bernama saat logika membutuhkan beberapa langkah, butuh komentar, atau perlu diuji dengan pytest. Panduan praktisnya sederhana: bila lambda sudah sulit dibaca tanpa penjelasan panjang, fungsi bernama dengan nama deskriptif seperti format_rupiah() lebih mudah dirawat.

Lambda menyelesaikan transformasi nilai baris demi baris dengan ringkas. Untuk label yang berulang seperti tipe pelanggan atau kanal pembelian, pandas menyediakan pendekatan yang lebih terkelola: tipe data category. Chapter berikutnya membahas cara mengubah kolom teks menjadi kategori dan memetakan label lama ke label baru.