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
.
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:
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 remediMari kita telaah apa yang terjadi pada kode di atas:
- Baris 3-9: membangun DataFrame
skorberisi tiga peserta dengan nilai tugas dan nilai ujian. - Baris 11:
assign(rata_rata=lambda d: ...)meminta pandas membuat kolomrata_rata; parameterdmenerima DataFrameskorpada saat itu, dan pembagian/ 2membuat kolom baru bertipefloat64. - Baris 13-18: dua kelompok
printmenunjukkanskortetap tiga kolom, sementaraskor_baruberisi empat kolom — bukti bahwa data asli tidak berubah. - Baris 20-24:
assign()kedua menambahkan kolomstatus; lambda di dalamnya membaca kolomrata_ratayang baru saja dibuat, laluapply()mengubah setiap nilainya menjadilulusatauremedi. - Baris 25:
print(laporan)menampilkan DataFramelaporanyang 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:
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.
| Gaya | Ciri |
|---|---|
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.