
Pandas – Apply
Perlu melakukan manipulasi/kalkulasi pada kolom atau baris pada pandas? Gunakan fungsi apply.
Kode Lima Detik
import pandas as pd df = pd.read_csv('https://bit.ly/penjualan_bd') # Berdasar kolom, axis=0 atau tanpa axis def penjumlahan_kolom(x): return x.sum() df.apply(penjumlahan_kolom) def fungsi_diskon_kolom(x): return x * 0.05 df['diskon_jan'] = df['jan'].apply(fungsi_diskon_kolom) # Berdasar baris, axis=1 def diskon_baris(x): total = x[['jan', 'feb', 'mar', 'apr']].sum() diskon = total * 0.05 return diskon df['diskon'] = df.apply(fungsi_diskon_baris, axis=1) # Lambda df[['jan', 'feb', 'mar', 'apr']].apply(lambda x: x/2, axis=1)
Kapan Digunakan
Fungsi apply dimanfaatkan saat kita perlu melakukan membuat/memanipulasi/mengubah/melakukan kalkulasi kolom atau baris pada pandas.
Penggunaan
Data yang digunakan adalah data penjualan yang dapat diunduh di sini.
import pandas as pd df = pd.read_csv('https://bit.ly/penjualan_bd')

Manipulasi Berdasarkan Kolom
Secara default fungsi apply memiliki parameter axis yang diberi nilai 0 yang berarti fungsi yang dipanggil oleh apply akan diterapkan pada semua kolom. Misal seperti ini.
def penjumlahan_kolom(x): return x.sum() df.apply(penjumlahan_kolom) df.apply(penjumlahan_kolom, axis=1)

Fungsi penjumlahan_kolom hanya melakukan satu hal, yaitu menjumlahkan semua data (variabel x). Saat fungsi penjumlahan_kolom dipanggil melalui apply tanpa axis (axis = 0) maka fungsi penjumlahan_kolom diterapkan pada semua kolom sehingga hasilnya:
- (kolom) nama: Andi BurhanuddinBudi CakrawalaCharlie DarsonoD…
- (kolom) jan: 1870
- (kolom) feb: 2209
- (kolom) mar: 1655
- (kolom apr: 1350
Jika parameter axis = 1, fungsi penjumlahan_kolom diterapkan pada semua baris. Hal tersebut akan menyebabkan pesan kesalahan “can only concatenate str (not “int”) to str” karena pada tiap baris, masing-masing kolom akan ditambahkan padahal kolom nama berisi teks, berbeda dengan kolom lainnya yang berisi angka, kedua jenis kolom yang berbeda tersebut tidak dapat ditambahkan.
Menambah data
Kita dapat menambah kolom berdasarkan kolom lain.
def fungsi_diskon_kolom(x): return x * 0.05 df['diskon_jan'] = df['jan'].apply(fungsi_diskon_kolom)

Kode di atas membuat sebuah kolom bernama diskon_jan berdasarkan kolom jan. Kolom yang digunakan, kolom jan, didefinisikan agar fungsi apply tahu fungsi_diskon_kolom akan diaplikasikan pada kolom apa. Jika tidak didefinisikan maka pandas akan mengeluarkan pesan kesalahan karena fungsi perkalian tidak dapat diterapkan pada kolom nama yang berisi teks.

Mengubah data
def bagi_dua(x): return x / 2 df['jan'] = df['jan'].apply(bagi_dua) df['feb'] = df['feb'].apply(bagi_dua)

Manipulasi Berdasarkan Baris
Menambah data
Seperti dijelaskan sebelumnya, jika parameter axis=1 maka fungsi akan diaplikasikan berdasarkan baris (semua kolom pada baris tersebut akan diikutkan dalam fungsi).
def diskon_baris(x): total = x[['jan', 'feb', 'mar', 'apr']].sum() diskon = total * 0.05 return diskon df['diskon'] = df.apply(fungsi_diskon_baris, axis=1)

Fungsi diskon_baris hanya menggunakan kolom jan, feb, mar dan apr pada masing-masing baris. Nilai dari 4 kolom tersebut ditambahkan (variabel total) kemudian dikalikan dengan 0,05.
Mengubah data
def separuh(x): return x / 2 df[['jan', 'feb', 'mar', 'apr']].apply(separuh, axis=1)

Lambda
Pada Python sebuah fungsi anonim dapat dipanggil menggunakan keyword lambda. Fungsi apply dapat memanggil lambda, terutama jika operasi yang dilakukan tidak terlalu rumit. Misal fungsi separuh di atas dapat kita ubah menjadi lambda seperti ini.
df[['jan', 'feb', 'mar', 'apr']].apply(lambda x: x/2, axis=1)

Keuntungan menggunakan lambda, semua kode ada di dalam fungsi apply, tidak perlu melihat baris fungsi yang dipanggil oleh apply. Namun menggunakan lambda kita relatif akan kesulitan jika perlu operasi/kalkukasi yang lebih rumit.
One Reply to “Pandas – Apply”