Menambah kolom hasil perhitungan adalah pekerjaan harian analis: kolom rata-rata, kolom status kelulusan, atau kolom total belanja. Cara paling umum adalah df["kolom_baru"] = ..., namun pola itu mengubah DataFrame langsung dan membuat rangkaian transformasi yang panjang sulit dirapikan. Method assign() menawarkan jalur lain: pandas mengembalikan DataFrame baru yang sudah berisi kolom tambahan, sementara DataFrame asli tetap utuh. Chapter ini membahas assign() untuk satu kolom, beberapa kolom sekaligus, dan penggunaannya di dalam method chaining.

Menambah Kolom dengan assign() #

Method assign() menerima satu atau lebih argumen kata kunci; nama argumen menjadi nama kolom baru, dan nilainya boleh berupa skalar, Series, atau callable. Ketika kita mengirim callable — biasanya lambda — pandas memanggil fungsi itu dengan DataFrame saat itu sebagai argumennya, sehingga kolom baru dapat menghitung dirinya dari kolom-kolom lain. Nilai baliknya selalu DataFrame baru. Dengan Copy-on-Write yang selalu aktif di pandas 3.0, tidak ada satu sel pun pada DataFrame asli yang tersentuh; jaminan perilaku ini dijelaskan di panduan Copy-on-Write , sementara daftar parameternya ada di dokumentasi pandas.DataFrame.assign .

python
import pandas as pd

skor = pd.DataFrame(
    {
        "nama": ["Budi", "Siti", "Dewi"],
        "nilai_tugas": [80, 90, 75],
        "nilai_ujian": [70, 85, 60],
    }
)

skor_baru = skor.assign(rata_rata=lambda d: (d["nilai_tugas"] + d["nilai_ujian"]) / 2)

print("DataFrame asli (tidak berubah):")
print(skor)
print()
print("DataFrame hasil assign():")
print(skor_baru)
print()

laporan = skor_baru.assign(
    status=lambda d: d["rata_rata"].apply(
        lambda nilai: "lulus" if nilai >= 75 else "remedi"
    )
)
print(laporan)

Output yang Dihasilkan:

text
DataFrame asli (tidak berubah):
   nama  nilai_tugas  nilai_ujian
0  Budi           80           70
1  Siti           90           85
2  Dewi           75           60

DataFrame hasil assign():
   nama  nilai_tugas  nilai_ujian  rata_rata
0  Budi           80           70       75.0
1  Siti           90           85       87.5
2  Dewi           75           60       67.5

   nama  nilai_tugas  nilai_ujian  rata_rata  status
0  Budi           80           70       75.0   lulus
1  Siti           90           85       87.5   lulus
2  Dewi           75           60       67.5  remedi

Mari kita telaah apa yang terjadi pada kode di atas:

  1. Baris 3-9: membangun DataFrame skor berisi tiga peserta dengan nilai tugas dan nilai ujian.
  2. Baris 11: assign(rata_rata=lambda d: ...) meminta pandas membuat kolom rata_rata; parameter d menerima DataFrame skor pada saat itu, dan pembagian / 2 membuat kolom baru bertipe float64.
  3. Baris 13-18: dua kelompok print menunjukkan skor tetap tiga kolom, sementara skor_baru berisi empat kolom — bukti bahwa data asli tidak berubah.
  4. Baris 20-24: assign() kedua menambahkan kolom status; lambda di dalamnya membaca kolom rata_rata yang baru saja dibuat, lalu apply() mengubah setiap nilainya menjadi lulus atau remedi.
  5. Baris 25: print(laporan) menampilkan DataFrame laporan yang lengkap.

Output tersebut membuktikan dua hal sekaligus. Pertama, DataFrame skor tetap tiga kolom karena assign() tidak pernah menulis ke objek lamanya. Kedua, kolom rata_rata lahir bertipe float64 karena pembagian bilangan bulat di Python menghasilkan pecahan; bila kita memang butuh bilangan bulat, bungkus perhitungannya dengan .astype("Int64") seperti yang dibahas pada Chapter mengubah tipe data di Section Manipulasi Data.

Beberapa Kolom dalam Satu Panggilan #

Satu pemanggilan assign() boleh memuat beberapa argumen kata kunci sekaligus, dan pandas mengevaluasinya satu per satu dari kiri ke kanan. Akibatnya, lambda yang ditulis lebih belakang boleh membaca kolom yang didefinisikan lebih dulu dalam panggilan yang sama. Pola ini membuat perhitungan bertingkat tetap terkumpul pada satu titik:

python
lengkap = skor.assign(
    rata_rata=lambda d: (d["nilai_tugas"] + d["nilai_ujian"]) / 2,
    status=lambda d: d["rata_rata"].apply(
        lambda nilai: "lulus" if nilai >= 75 else "remedi"
    ),
)

Argumen rata_rata dievaluasi lebih dulu, sehingga lambda status dapat membaca kolom rata_rata tanpa perlu memanggil assign() kedua. Hasil lengkap setara dengan rantai dua assign() pada contoh utama, hanya saja seluruh definisi kolom berjajar dalam satu panggilan yang mudah dibaca. Pilih bentuk yang konsisten untuk satu proyek agar gaya penulisan tidak campur aduk.

assign() di dalam Method Chaining #

Nilai balik berupa DataFrame menjadikan assign() pas untuk dirangkai: setiap method menerima dan mengembalikan DataFrame, sehingga kita dapat menyusun transformasi seperti kalimat. Tabel berikut membandingkan dua gaya penulisan kolom baru.

GayaCiri
df["rata_rata"] = ...Mengubah df langsung; langkah berikutnya harus menulis df lagi
df.assign(rata_rata=...)Mengembalikan DataFrame baru; bisa dirangkai dengan .sort_values() dan method lain

Dengan gaya chaining, variabel perantara tidak diperlukan dan urutan transformasi terbaca dari atas ke bawah. Kebiasaan ini semakin berguna ketika kita masuk ke method pipe() pada Chapter berikutnya, yang menyisipkan fungsi bebas ke dalam rantai yang sama.

Setelah kolom-kolom baru tertata dalam rantai assign(), langkah logis berikutnya adalah memasukkan fungsi besar buatan sendiri ke dalam rantai yang sama. Method pipe() dirancang untuk itu: fungsi apa pun yang menerima dan mengembalikan DataFrame dapat disisipkan sebagai mata rantai, dan itulah bahasan penuh Chapter berikutnya.