Chapter Method apply() memperkenalkan perilaku bawaan apply() pada DataFrame, yaitu memanggil fungsi satu kali per kolom. Banyak kebutuhan nyata justru bergerak ke arah lain: nilai akhir setiap siswa baru dapat dihitung setelah melihat nilai tugas dan ujian pada baris yang sama. Parameter axis mengatur arah ini; kita menyetelnya ke 0 untuk bekerja per kolom dan ke 1 untuk bekerja per baris. Chapter ini membedah kedua arah, alias penamaannya, serta result_type untuk menghasilkan beberapa kolom sekaligus.
Arti Parameter axis #
Pada apply(), parameter axis menjawab pertanyaan arah kerja fungsi. Dengan axis=0 — nilai bawaan, aliasnya axis="index" — pandas memanggil fungsi satu kali untuk setiap kolom, dan fungsi menerima Series berisi nilai kolom itu dari atas ke bawah. Dengan axis=1 — aliasnya axis="columns" — pandas memanggil fungsi satu kali untuk setiap baris, dan fungsi menerima Series berisi nilai baris itu; index Series baris adalah nama-nama kolom. Berpikirlah searah pergerakan fungsi: axis=0 bergerak vertikal melewati baris sehingga fungsi selesai per kolom, sedangkan axis=1 bergerak horizontal melewati kolom sehingga fungsi selesai per baris. Tabel parameter lengkap ada di dokumentasi pandas.DataFrame.apply
, sementara pandas.Series.apply
menunjukkan bahwa Series tidak membutuhkan axis karena hanya punya satu dimensi.
import pandas as pd
nilai = pd.DataFrame(
{
"tugas": [80, 90, 75],
"ujian": [70, 85, 65],
},
index=["Budi", "Siti", "Dewi"],
)
per_kolom = nilai.apply(lambda kolom: kolom.max() - kolom.min(), axis=0)
per_baris = nilai.apply(lambda baris: baris.max() - baris.min(), axis=1)
print(per_kolom)
print()
print(per_baris)Output yang Dihasilkan:
tugas 15
ujian 20
dtype: int64
Budi 10
Siti 5
Dewi 10
dtype: int64Mari kita telaah apa yang terjadi pada kode di atas:
- Baris 3-9: membangun DataFrame
nilaidengan dua kolom penilaian dan index berupa nama siswa. - Baris 11:
apply()denganaxis=0memanggil lambda untuk kolomtugasdan kolomujian; hasilnya Series dua baris yang index-nya nama kolom. - Baris 12:
apply()denganaxis=1memanggil lambda untuk barisBudi,Siti, danDewi; hasilnya Series tiga baris yang index-nya nama siswa. - Baris 14-16: perintah
printmenampilkan kedua hasil berurutan.
Angka pada output kedua mudah dicek: Budi memiliki tugas 80 dan ujian 70, sehingga selisihnya 10. Yang lebih penting, lambda menerima baris sebagai Series yang index-nya berupa nama kolom, karena itu baris["tugas"] dan baris["ujian"] sah ditulis. Dengan akses tersebut, fungsi per baris dapat mengambil keputusan dari beberapa kolom sekaligus — kebutuhan yang tidak bisa dijawab oleh operasi satu kolom saja.
Mengembalikan Beberapa Kolom dengan result_type #
Fungsi per baris kadang perlu menghasilkan lebih dari satu nilai, misalnya total belanja beserta kategorinya sekaligus. Apabila fungsi mengembalikan Series, apply() dapat membentangkan nilai-nilainya menjadi kolom-kolom baru melalui result_type="expand".
import pandas as pd
pesanan = pd.DataFrame(
{
"produk": ["Kopi Gayo", "Teh Melati", "Gula Aren"],
"harga": [85000, 32000, 24000],
"jumlah": [12, 30, 25],
}
)
def ringkas(baris):
return pd.Series(
{
"total": baris["harga"] * baris["jumlah"],
"kategori": "premium" if baris["harga"] >= 50000 else "standar",
}
)
hasil = pesanan.apply(ringkas, axis=1, result_type="expand")
print(hasil)Output yang Dihasilkan:
total kategori
0 1020000 premium
1 960000 standar
2 600000 standarBedah baris demi baris:
- Baris 3-9: membangun DataFrame
pesananberisi tiga produk beserta harga dan jumlah belinya. - Baris 12-18: mendefinisikan
ringkas(); fungsi menerima satu baris dan mengembalikanpd.Seriesdengan dua entri bernamatotaldankategori. - Baris 21:
apply(..., axis=1, result_type="expand")membentangkan Series hasil setiap baris menjadi DataFrame dengan dua kolom baru. - Baris 23: perintah
printmenampilkan DataFrame hasil pembentangan.
Nama entri pada Series yang dikembalikan ringkas() menjadi nama kolom pada output, dan nilai balik apply() berupa DataFrame utuh yang siap dipakai lebih lanjut. Bentuk lain yang tersedia adalah result_type="reduce", yang memaksa hasil list-like menjadi satu nilai skalar per baris; ketiga opsi dijelaskan pada dokumentasi apply() yang dirujuk di awal chapter.
Sekarang kita menguasai arah kerja apply() mulai dari per kolom, per baris, hingga pembentukan kolom baru. Pada Chapter berikutnya kita merapikan penulisan semua pola ini dengan fungsi lambda — fungsi sebaris yang menjaga transformasi tetap ringkas tanpa kehilangan kejelasan.