Memahami Metode Apply pada Dataframe Pandas


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:
- Membuat fungsi lambda dengan 1 parameter yaitu
id
- kita mengambil karakter pertama dari
id
melalui sintaksid[0]
- kemudian dengan menggunakan f-string, kita memformat
id
mulai karakter kedua sampai terakhirid[1:]
. - format yang dilakukan yaitu
:0>3
, artinya membuat teks menjadi3
karakter, dan jika jumlah teks kurang maka tambahkan karakter0
pada bagian awal teks (0
menunjukkan karakter yang ditambahkan dan tanda>
menunjukkan penambahan dilakukan di awal). - 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:
- Penentuan parameter
axis
: secara default nilaiaxis
adalah0
, 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 nilaiaxis=1
. - 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
Tutorial Pandas