Memahami Metode Apply pada Dataframe Pandas

Metode Apply Pandas Dataframe Python

Metode apply

Pandas dataframe memiliki metode apply yang berfungsi untuk menerapkan suatu fungsi ke setiap elemen, baris, atau kolom pada dataframe. Fungsi yang diterapkan bisa berupa fungsi bawaan Python atau fungsi yang didefinisikan sendiri. Fitur ini memberikan fleksibilitas dalam melakukan operasi pada dataframe dengan cara yang berbeda-beda. Hasil dari fungsi apply dapat disimpan sebagai informasi baru pada dataframe, ataupun memperbarui data yang sudah ada.

Metode apply dapat digunakan mulai operasi yang sederhana hingga kompleks. Kita dapat mendefinisikan fungsi khusus yang membutuhkan argumen tambahan dan menerapkannya pada DataFrame. Misalnya membuat fungsi untuk menghitung total diskon berdasarkan jumlah belanja dan status membership untuk setiap baris, dan kemudian menerapkannya pada kolom-kolom dataframe yang sesuai.

Pada bagian berikut ini, akan diberikan beberapa contoh bagaimana penerapan metode apply dengan berbagai kondisi.

Misalkan terdapat dataframe dengan dua kolom yaitu CUST_ID yang merupakan ID dari pelanggan dan NAME merupakan nama pelanggan. Dengan memanfaatkan metode apply, kita dapat menambahkan kolom-kolom baru berdasarkan kreteria tertentu yang didefinisikan pada sebuah fungsi.

Berikut bentuk dataframe data pelanggan yang akan digunakan:

Kode

import pandas as pd

dict_cust = {
    "CUST_ID": ["S1", "S12", "G41", "S132", "G2", "S4", "S15", "D1", "D12", "G13"],
    "NAME": ["Amy", "Bob", "Case", "Dave", "Edy", "Finn", "Greg", "Han", "Ian", "Joe"],
}

data = pd.DataFrame(dict_cust)

print(data)
# OUTPUT

  CUST_ID  NAME
0      S1   Amy
1     S12   Bob
2     G41  Case
3    S132  Dave
4      G2   Edy
5      S4  Finn
6     S15  Greg
7      D1   Han
8     D12   Ian
9     G13   Joe

Update Data Kolom

Pada dataframe ini, kolom CUST_ID memiliki format yang kurang rapi karena panjang karakter yang berbeda-beda tergantung nomor yang muncul setelah karakter pertama. Misal jumlah karakter akan dibuat menjadi 4 karakter, dimana karakter pertama tetap (S, G, atauu D) dan diikuti 3 karakter angka. Jika angka kurang dari 3 digit maka ditambahkan 0 didepannya.

Karena proses yang kita perlukan relatif sederhana, maka untuk bagian ini dapat menggunakan fungsi lambda langsung sebagai argumen dalam metode apply.

Penjelasan singkat proses di dalam fungsi lambda tersebut adalah sebagai berikut:

  1. Membuat fungsi lambda dengan 1 parameter yaitu id
  2. kita mengambil karakter pertama dari id melalui sintaks id[0]
  3. kemudian dengan menggunakan f-string, kita memformat id mulai karakter kedua sampai terakhir id[1:].
  4. format yang dilakukan yaitu :0>3, artinya membuat teks menjadi 3 karakter, dan jika jumlah teks kurang maka tambahkan karakter 0 pada bagian awal teks (0 menunjukkan karakter yang ditambahkan dan tanda > menunjukkan penambahan dilakukan di awal).
  5. lalu gabungkan kembali karakter pertama dengan karakter hasil f-string.

Fungsi lambda tersebut menjadi argumen untuk metode apply milik kolom CUST_ID. Selanjutnya hasil disimpan kembali pada kolom CUST_ID. Pada output di bawah ini, dapat dilihat kolom CUST_ID sudah berubah dengan jumlah karakter yang sama.

Kode

data["CUST_ID"] = data["CUST_ID"].apply(lambda id: id[0] + f"{id[1:]:0>3}")

print(data)
# OUTPUT

  CUST_ID  NAME
0    S001   Amy
1    S012   Bob
2    G041  Case
3    S132  Dave
4    G002   Edy
5    S004  Finn
6    S015  Greg
7    D001   Han
8    D012   Ian
9    G013   Joe

Membuat Kolom Baru

Pada bagian ini, akan dibuat kolom baru pada dataframe data. Kolom akan berisi informasi LEVEL dari kustomer. Misalkan level direpresentasikan dari huruf pertama pada CUST_ID, yaitu S untuk Standard, G untukk Gold dan D untuk Diamond. Untuk membuatnya, dapat menggunakan metode apply dan menyimpannya pada kolom baru dengan nama LEVEL.

Proses yang diperlukan pada bagian ini lebih panjang dari sebelumnya, maka akan kita buat dalam bentuk fungsi sendiri dengan nama get_level. Fungsi menerima 1 argumen yaitu cust_id. Fungsi tersebut berisi pengecekan karakter pertama pada cust_id dan mengembalikan nilai yang berbeda sesuai dari karakter pertama tersebut.

Selanjutnya, untuk menggunakannya, panggil metode apply pada kolom CUST_ID dengan fungsi get_level sebagai argumennya. Hasil dari pemanggilan tersebut kemudian disimpan pada kolom LEVEL.

Kode

# S : kelas "Standard"
# G : kelas "Gold"
# D : kelas "Diamond"

# membuat fungsi
def get_level(cust_id):
    sym = cust_id[0]
    if sym == "S":
        return "Standard"
    elif sym == "G":
        return "Gold"
    elif sym == "D":
        return "Diamond"
    else:
        return None


# apply fungsi pada kolom CUST_ID dan simpan pada kolom baru 'LEvEL'

data["LEVEL"] = data["CUST_ID"].apply(get_level)

print(data)
# OUTPUT

  CUST_ID  NAME     LEVEL
0    S001   Amy  Standard
1    S012   Bob  Standard
2    G041  Case      Gold
3    S132  Dave  Standard
4    G002   Edy      Gold
5    S004  Finn  Standard
6    S015  Greg  Standard
7    D001   Han   Diamond
8    D012   Ian   Diamond
9    G013   Joe      Gold

Satu Fungsi untuk Beberapa Kolom

Pada dataframe, bisa jadi terdapat beberapa kolom dengan karakteristik yang sama dan dapat menerima tindakan yang sama pula. Jika terdapat kondisi seperti ini, maka sebuah fungsi dapat menjadi argumen pada beberapa kolom yang sesuai. Pada contoh berikut, ditambahkan 2 kolom baru yaitu PURCHASE_1 dan PURCHASE_2. Kolom-kolom ini berisi informasi jumlah belanja kustomer untuk pertama dan kedua.

Berikut dataframe yang sudah ditambahkan dengan dua kolom tersebut:

Kode

# menambah data pembelian pertama dan kedua
data["PURCHASE_1"] = [150, 120, 320, 90, 260, 360, 100, 540, 320, 210]
data["PURCHASE_2"] = [90, 80, 500, 230, 250, 280, 150, 360, 470, 160]

print(data)
# OUTPUT

  CUST_ID  NAME     LEVEL  PURCHASE_1  PURCHASE_2
0    S001   Amy  Standard         150          90
1    S012   Bob  Standard         120          80
2    G041  Case      Gold         320         500
3    S132  Dave  Standard          90         230
4    G002   Edy      Gold         260         250
5    S004  Finn  Standard         360         280
6    S015  Greg  Standard         100         150
7    D001   Han   Diamond         540         360
8    D012   Ian   Diamond         320         470
9    G013   Joe      Gold         210         160

Misalkan terdapat kebijakan pemberian diskon bagi kustomer dengan batas nominal tertentu. Diskon akan diberikan sebesar 10% untuk berbelanja lebih dari 200, atau diskon sebesar 5% untuk belanja di atas 100 dan untuk nominal di bawah 100 tidak mendapatkan diskon. Jika ketentuan ini berlaku pada belanja pertama maupun kedua, maka kita dapat menambahkan kolom besaran diskon untuk keduanya.

Seperti sebelumnya, buat fungsi yang akan memproses perhitungan diskon tersebut . Fungsi kemudian dijadikan argumen untuk metode apply baik dari kolom PURCHASE_1 maupun PUCHASE_2. Hasil kedua pemanggilan selanjutnya disimpan pada kolom DISC_1 dan DISC_2.

Dapat dilihat dari output yang diperoleh pada kolom DISC_1 dan DISC_2, setiap barisnya akan memiliki nilai sesuai dengan fungsi yang diterapkan. Sebagai contoh, Amy dan Bob, tidak mendapatkan diskon apapun pada pembelian kedua karena jumlah belanja keduanya hanya 90 dan 80 saja.

Kode

# akan diberikan diskon 10% untuk setiap belanja > 200 
# atau diskon 5% untuk setiap belanja lebih dari > 100

def get_disc(purchase):
    if purchase > 200:
        return 0.1 * purchase
    elif purchase > 100:
        return 0.05 * purchase
    else:
        return 0
    

# apply pada belanja pertama dan kedua

data["DISC_1"] = data["PURCHASE_1"].apply(get_disc)
data["DISC_2"] = data["PURCHASE_2"].apply(get_disc)


print(data)
# OUTPUT

  CUST_ID  NAME     LEVEL  PURCHASE_1  PURCHASE_2  DISC_1  DISC_2
0    S001   Amy  Standard         150          90     7.5     0.0
1    S012   Bob  Standard         120          80     6.0     0.0
2    G041  Case      Gold         320         500    32.0    50.0
3    S132  Dave  Standard          90         230     0.0    23.0
4    G002   Edy      Gold         260         250    26.0    25.0
5    S004  Finn  Standard         360         280    36.0    28.0
6    S015  Greg  Standard         100         150     0.0     7.5
7    D001   Han   Diamond         540         360    54.0    36.0
8    D012   Ian   Diamond         320         470    32.0    47.0
9    G013   Joe      Gold         210         160    21.0     8.0

Mengakses Seluruh Kolom DataFrame

Dalam beberapa kasus, proses perhitungan melibatkan beberapa kolom sekaligus. Sementara pada contoh-contoh sebelumnya, metode apply dipanggil melalui kolom-kolom tertentu saja misal CUST_ID, atau PURCHASE_1 atau PURCHASE_2 saja.

Lalu bagaimana jika beberapa kolom tersebut diperlukan secara bersamaan dalam perhitungan?

Terdapat dua cara yang dapat dilakukan, pertama mengirimkan argumen tambahan pada metode apply dan yang kedua memanggil metode apply langsung dari dataframe (bukan dari 1 kolom tertentu). Cara kedua tentunya jauh lebih sederhana karena tidak harus memikirkan kolom mana saja yang harus dikirim sebagai argumen tambahan.

Ada dua hal yang perlu diperhatikan jika memanggil metode apply langsung dari dataframe, yaitu:

  1. Penentuan parameter axis : secara default nilai axis adalah 0, dimana fungsi diterapkan kolom per kolom untuk baris tertentu. Sementara, contoh yang akan kita lakukan adalah sebaliknya, fungsi diterapkan baris per baris untuk kolom tertentu. Oleh karena itu perlu mengatur nilai axis=1.
  2. Parameter fungsi yang digunakan dalam apply akan menerima data semua kolom, sehingga di dalam fungsi tersebut kita dapat mengakses berdasarkan nama kolom yang bersesuaian.

Seperti contoh berikut, kustomer berpeluang mendapatkan voucher belanja dengan ketentuan total belanja pertama dan kedua mencapai batasan tertentu dan memiliki level tertentu. Penentuan voucher ini memerlukan 3 informasi sekaligus, maka kita dapat menerapkan metode apply langsung dari dataframe yaitu menggunakan sintaks data.apply(...) (bukan data["nama_kolom"].apply(...) seperti sebelumnya).

Di dalam fungsi get_voucher parameter customer berisi informasi semua kolom, maka untuk mendapatkan nilai pembelian dapat menggunakan sintaks customer["PURCHASE_1"] atau customer["PURCHASE_2"]. Begitu pula untuk mendapatkan informasi level menggunakan sintaks customer["LEVEL"].

Kode

# Mengambil 2 atau lebih kolom

"""
Dapat voucher belanja
dengan rule berikut:
# Voucher 50 : Jika Total belanja >= 800 dan Level Diamond atau GOLD
# voucher 25 : jika Total belanja >= 500 dan Level Diamond atau GOLD
"""

def get_voucher(customer):
    tot = customer["PURCHASE_1"] + customer["PURCHASE_2"]
    lvl = customer["LEVEL"]
    elig_lvl = ("Gold", "Diamond")

    if (tot >= 800) and (lvl in elig_lvl):
        return 50
    elif (tot >= 500) and (lvl in elig_lvl):
        return 25
    else:
        return 0
    

# apply fungsi get_voucher pada dataframe
data["VOUCHER"] = data.apply(get_voucher, axis=1)

print(data)
# OUTPUT

  CUST_ID  NAME     LEVEL  PURCHASE_1  PURCHASE_2  DISC_1  DISC_2  VOUCHER
0    S001   Amy  Standard         150          90     7.5     0.0        0
1    S012   Bob  Standard         120          80     6.0     0.0        0
2    G041  Case      Gold         320         500    32.0    50.0       50
3    S132  Dave  Standard          90         230     0.0    23.0        0
4    G002   Edy      Gold         260         250    26.0    25.0       25
5    S004  Finn  Standard         360         280    36.0    28.0        0
6    S015  Greg  Standard         100         150     0.0     7.5        0
7    D001   Han   Diamond         540         360    54.0    36.0       50
8    D012   Ian   Diamond         320         470    32.0    47.0       25
9    G013   Joe      Gold         210         160    21.0     8.0        0

Ringkasan

Pada tutorial ini, sudah dibahas mengenai penggunaan metode apply pada dataframe pandas. Metode ini dapat digunakan untuk mengupdate kolom yang sudah ada, maupun menambahkan kolom baru berdasarkan informasi dari kolom-kolom lainnya. Metode apply dapat diterapkan dengan fungsi yang sederhana maupun yang lebih kompleks, sehingga proses manipulasi dataframe menjadi lebih fleksibel sesuai keperluan.

Dokumentasi

You may also like...

Leave a Reply

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

Daftar Isi