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.

python
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:

text
tugas    15
ujian    20
dtype: int64

Budi    10
Siti     5
Dewi    10
dtype: int64

Mari kita telaah apa yang terjadi pada kode di atas:

  1. Baris 3-9: membangun DataFrame nilai dengan dua kolom penilaian dan index berupa nama siswa.
  2. Baris 11: apply() dengan axis=0 memanggil lambda untuk kolom tugas dan kolom ujian; hasilnya Series dua baris yang index-nya nama kolom.
  3. Baris 12: apply() dengan axis=1 memanggil lambda untuk baris Budi, Siti, dan Dewi; hasilnya Series tiga baris yang index-nya nama siswa.
  4. Baris 14-16: perintah print menampilkan 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".

python
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:

text
     total kategori
0  1020000  premium
1   960000  standar
2   600000  standar

Bedah baris demi baris:

  1. Baris 3-9: membangun DataFrame pesanan berisi tiga produk beserta harga dan jumlah belinya.
  2. Baris 12-18: mendefinisikan ringkas(); fungsi menerima satu baris dan mengembalikan pd.Series dengan dua entri bernama total dan kategori.
  3. Baris 21: apply(..., axis=1, result_type="expand") membentangkan Series hasil setiap baris menjadi DataFrame dengan dua kolom baru.
  4. Baris 23: perintah print menampilkan 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.