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.
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:
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 1200000Mari kita telaah apa yang terjadi pada kode di atas:
- Baris 17-19 (
pesanan["nilai_transaksi"].map(lambda t: ...)):map()memanggil lambda sekali untuk setiap nilai kolomnilai_transaksi. f-stringf"Rp{t:,.0f}"menghasilkan format Amerika sepertiRp1,800,000, lalu.replace(",", ".")mengubah koma pemisah ribuan menjadi titik sehingga hasilnyaRp1.800.000. Hasilmap()adalah Series baru bertipestr; dataset asli tidak berubah. - Baris 23-27 (
pesanan.assign(...)): method DataFrame.assign() meneruskan DataFramepesananke lambdad, lalu di dalamnyamap()kedua menjalankan lambda bersyarat: transaksi 1 juta ke atas mendapat potongan 10 persen, sisanya 5 persen. Ekspresit * 0.10 if t >= 1_000_000 else t * 0.05adalah conditional expression Python yang sah di dalam lambda. Kolomdiskonbertipefloat64karena dikalikan angka desimal. - Baris 31-33 (
pesanan.apply(..., axis=1)):apply()denganaxis=1mengirim satu baris sebagai Seriesrpada setiap pemanggilan lambda. Lambda membacaberat_paketdari baris tersebut, mengalikannya dengan tarif 10.000 per kilogram, lalumax(..., 15_000)menetapkan ongkir minimum 15.000. Pola ini dipakai saat perhitungan melibatkan lebih dari satu kolom. - 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.