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.


Cover Image by athree23 from Pixabay

One Reply to “Pandas – Apply”

  1. Pingback: Bar Chart Race

Leave a Reply

Your email address will not be published. Required fields are marked *