apply() pada Kolom dan Baris
Gunakan DataFrame.apply() dengan axis=0 dan axis=1 untuk menjalankan fungsi khusus pada setiap kolom atau baris.
apply() pada Kolom dan Baris adalah pelajaran Pandas & NumPy Academy gratis di CoddyKit. Ini adalah pelajaran 1 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Pandas & NumPy Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Pandas & NumPy Academy mencakup 4 pelajaran total.
Kapan Menggunakan apply()
DataFrame.apply() menjalankan fungsi Python khusus pada setiap kolom (axis=0) atau setiap baris (axis=1). Ini merupakan pilihan terakhir — lebih lambat daripada operasi vektorisasi bawaan — tetapi penting ketika perhitungan tidak dapat dinyatakan dengan aritmetika NumPy, pengindeksan boolean, atau fungsi agregasi bawaan. Gunakan ini saat Anda memerlukan logika kondisional yang kompleks, penguraian string khusus, atau perhitungan bertahap yang bekerja pada satu baris atau kolom pada satu waktu.
import pandas as pd
import numpy as np
df = pd.DataFrame({
'price': [10.5, 25.0, 8.3, 100.0],
'quantity': [3, 1, 5, 2],
'tax_rate': [0.05, 0.10, 0.05, 0.15]
})
print(df)apply() pada Kolom (axis=0)
Dengan axis=0 (nilai bawaan), apply() meneruskan setiap kolom sebagai Series ke fungsi. Fungsi menerima satu kolom pada satu waktu dan seharusnya mengembalikan skalar (untuk agregasi) atau Series (untuk transformasi). Ini berguna untuk menerapkan langkah normalisasi atau pembersihan khusus secara seragam pada semua kolom numerik dalam satu pemanggilan.
# Custom range normalisation (0 to 1) for each column
def min_max_scale(col):
return (col - col.min()) / (col.max() - col.min())
df_scaled = df[['price', 'quantity']].apply(min_max_scale, axis=0)
print(df_scaled)apply() pada Baris (axis=1)
Dengan axis=1, apply() meneruskan setiap baris sebagai Series ke fungsi. Indeks baris tersebut adalah nama kolom, sehingga Anda dapat mengakses nilai berdasarkan nama. Cara ini ideal untuk perhitungan tingkat baris yang bergantung pada beberapa kolom, seperti menghitung total pendapatan setelah pajak ketika setiap baris memiliki tarif pajaknya sendiri.
def revenue_after_tax(row):
subtotal = row['price'] * row['quantity']
return subtotal * (1 + row['tax_rate'])
df['revenue_after_tax'] = df.apply(revenue_after_tax, axis=1)
print(df)Mengembalikan Beberapa Nilai dengan apply()
Fungsi yang diteruskan ke apply(axis=1) dapat mengembalikan pd.Series dengan entri bernama, yang kemudian diperluas oleh Pandas menjadi beberapa kolom baru. Cara ini lebih rapi daripada memanggil apply() dua kali untuk membuat dua kolom baru. Sebagai alternatif, fungsi tersebut dapat mengembalikan dict, yang juga akan diperluas oleh Pandas menjadi kolom.
def compute_totals(row):
subtotal = row['price'] * row['quantity']
tax = subtotal * row['tax_rate']
return pd.Series({'subtotal': subtotal, 'tax': tax, 'total': subtotal + tax})
result = df.apply(compute_totals, axis=1)
print(result)apply() untuk Agregasi Khusus pada Kolom
Gunakan apply(func, axis=0) untuk menghitung statistik khusus bagi setiap kolom dan mengembalikan Series ringkasan. Sebagai contoh, hitung koefisien variasi (simpangan baku dibagi rata-rata) untuk setiap kolom numerik dalam satu pemanggilan. Hasilnya adalah Series yang diindeks berdasarkan nama kolom, sehingga berguna untuk diagnosis cepat per kolom.
def coeff_of_variation(col):
return col.std() / col.mean() if col.mean() != 0 else np.nan
cv = df[['price', 'quantity']].apply(coeff_of_variation, axis=0)
print('Coefficient of variation per column:')
print(cv)Membandingkan apply() dengan Alternatif Vektorisasi
Sebelum menggunakan apply(), selalu periksa apakah tersedia alternatif vektorisasi. Untuk perhitungan pendapatan setelah pajak, df['price'] * df['quantity'] * (1 + df['tax_rate']) menghasilkan hal yang sama seperti versi apply(axis=1), tetapi berjalan 10–100 kali lebih cepat karena menggunakan loop tingkat C NumPy. Gunakan apply() hanya jika logika vektorisasi akan menjadi terlalu kompleks dan sulit dibaca.
import time
start = time.time()
df['vectorised'] = df['price'] * df['quantity'] * (1 + df['tax_rate'])
print('Vectorised:', time.time() - start, 's')
start = time.time()
df['apply_result'] = df.apply(revenue_after_tax, axis=1)
print('apply():', time.time() - start, 's')apply() dengan Lambda
Untuk transformasi singkat satu baris, teruskan lambda secara langsung ke apply() daripada mendefinisikan fungsi bernama. Lambda ringkas untuk operasi sederhana, tetapi sebaiknya dihindari untuk logika kompleks yang lebih mudah dipahami dan diuji jika menggunakan fungsi bernama dengan komentar. Gunakan lambda secara terbatas — lambda sulit diuji sebagai unit atau dibuat profilnya berdasarkan nama.
# Clip revenue between 0 and 200, then round to nearest 10
df['revenue_clean'] = df['revenue_after_tax'].apply(lambda x: round(min(max(x, 0), 200) / 10) * 10)
print(df[['revenue_after_tax', 'revenue_clean']])Meneruskan Argumen Tambahan ke apply()
Teruskan argumen tambahan ke fungsi menggunakan tuple args atau argumen kata kunci dalam apply(func, args=(val,), axis=1). Cara ini menghindari penggunaan variabel global di dalam fungsi dan membuat fungsi dapat digunakan kembali dengan nilai parameter yang berbeda. Pada Python 3.8 ke atas, Anda juga dapat menggunakan functools.partial untuk membuat versi fungsi yang diterapkan sebagian.
def discount_price(row, discount_pct, threshold):
if row['quantity'] >= threshold:
return row['price'] * (1 - discount_pct)
return row['price']
df['discounted_price'] = df.apply(
discount_price, axis=1,
args=(0.1, 3) # 10% discount for quantity >= 3
)
print(df[['price', 'quantity', 'discounted_price']])apply() untuk Konversi Tipe
Ketika sebuah kolom berisi tipe campuran — sebagian integer, sebagian float, dan sebagian string — astype() akan menimbulkan error. Gunakan apply(pd.to_numeric, errors='coerce') untuk mencoba konversi baris demi baris dan mengembalikan NaN untuk nilai yang tidak dapat dikonversi. Ini merupakan pola yang aman untuk kolom yang seharusnya numerik, tetapi sesekali berisi entri nonnumerik akibat kesalahan entri data.
messy = pd.Series(['10', '20.5', 'N/A', '100', '--'])
clean = messy.apply(pd.to_numeric, errors='coerce')
print(clean)Performa: apply() dibandingkan dengan np.vectorize
Ketika fungsi yang bekerja pada skalar harus diterapkan pada setiap elemen, np.vectorize(func)(array) biasanya lebih cepat daripada Series.apply(func) karena vectorize milik NumPy menjalankan pemanggilan melalui C, bukan melalui overhead pemanggilan fungsi Python. Namun, np.vectorize tetap lebih lambat daripada broadcasting yang sebenarnya — gunakan hanya ketika tidak ada ekspresi broadcasting yang dapat mewakili logika tersebut.
def classify_size(price):
if price < 15:
return 'small'
elif price < 50:
return 'medium'
return 'large'
# np.vectorize approach
classify_v = np.vectorize(classify_size)
df['size_class'] = classify_v(df['price'].values)
print(df[['price', 'size_class']])Kapan apply() Merupakan Pilihan yang Tepat
Apply merupakan alat yang tepat ketika: (1) logika memerlukan percabangan berdasarkan beberapa nilai kolom secara bersamaan; (2) fungsi memanggil API atau basis data eksternal untuk setiap baris (sehingga memang harus berurutan); (3) fungsi mengurai string kompleks seperti blob JSON yang disimpan dalam sel; atau (4) fungsi mengembalikan objek dengan panjang yang bervariasi seperti list. Dalam kasus lainnya, utamakan operasi vektorisasi demi kecepatan dan keterbacaan.
import json
# Parse a JSON metadata column row by row
df['metadata'] = ['{"color": "red"}', '{"color": "blue"}', '{}', '{"color": "green"}']
df['color'] = df['metadata'].apply(lambda s: json.loads(s).get('color', 'unknown'))
print(df[['metadata', 'color']])Pemeriksaan Singkat
Uji pemahaman Anda tentang konsep Analisis Data dari pelajaran ini.
Ringkasan Pelajaran
Dalam pelajaran ini, Anda telah mempelajari: menggunakan apply(axis=0) untuk menghitung statistik khusus pada tingkat kolom, menggunakan apply(axis=1) untuk menghitung nilai pada tingkat baris dengan beberapa input kolom, dan mengenali kapan alternatif tervectorisasi lebih baik digunakan demi kinerja. Selanjutnya, kita akan mempelajari apply() dengan GroupBy untuk agregasi tingkat grup yang kompleks.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “apply() pada Kolom dan Baris” gratis?
Ya — teks lengkap “apply() pada Kolom dan Baris” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Pandas & NumPy Academy, upgrade ke CoddyKit PRO. Kursus Pandas & NumPy Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “apply() pada Kolom dan Baris”?
Gunakan DataFrame.apply() dengan axis=0 dan axis=1 untuk menjalankan fungsi khusus pada setiap kolom atau baris. Kamu berlatih Pandas & NumPy Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai Pandas & NumPy Academy?
Tidak diperlukan pengalaman sebelumnya. Pandas & NumPy Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 1 dari 4.
Berapa lama pelajaran “apply() pada Kolom dan Baris” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran Pandas & NumPy Academy ini?
Ya. Setiap pelajaran Pandas & NumPy Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- apply() pada Kolom dan Baris
- apply() dengan GroupBy
- map() dan applymap() untuk Operasi Per Elemen
- Perangkaian Metode dengan pipe()