Laporan penjualan hampir selalu menuntut kolom yang tidak tersedia di data mentah: total per transaksi, harga setelah diskon, atau perbandingan dua kolom. Di spreadsheet, kita menulis formula di sel pertama lalu menyeretnya ke bawah sampai baris terakhir. Di pandas, kita cukup menuliskan operasi antar kolom satu kali, dan hasilnya berlaku untuk seluruh baris tanpa penyeretan apa pun. Chapter ini membahas cara membangun kolom turunan dari kombinasi kolom lain serta dtype yang dihasilkan oleh setiap operasi.
Menambahkan Kolom Turunan #
Kita memakai data toko kue yang sama dengan chapter sebelumnya. DataFrame penjualan berisi kolom harga, diskon, dan jumlah; tugas kita adalah menghitung tiga kolom baru: harga akhir setelah diskon, omzet, dan harga rata-rata sebelum-sesudah diskon. Perhatikan bahwa setiap kolom baru didefinisikan dengan satu baris ekspresi yang menyebut kolom sumbernya secara gamblang.
import pandas as pd
penjualan = pd.DataFrame(
{
"produk": ["Bolu Pandan", "Brownies Kukus", "Donat Gula", "Roti Tawar"],
"harga": [18000, 25000, 8000, 12000],
"diskon": [1000, 2500, 500, 2000],
"jumlah": [35, 20, 50, 45],
}
)
penjualan["harga_akhir"] = penjualan["harga"] - penjualan["diskon"]
penjualan["omzet"] = penjualan["harga_akhir"] * penjualan["jumlah"]
penjualan["rata_harga"] = (penjualan["harga"] + penjualan["harga_akhir"]) / 2
print(penjualan)
print()
print(penjualan.dtypes)Output yang Dihasilkan:
produk harga diskon jumlah harga_akhir omzet rata_harga
0 Bolu Pandan 18000 1000 35 17000 595000 17500.0
1 Brownies Kukus 25000 2500 20 22500 450000 23750.0
2 Donat Gula 8000 500 50 7500 375000 7750.0
3 Roti Tawar 12000 2000 45 10000 450000 11000.0
produk str
harga int64
diskon int64
jumlah int64
harga_akhir int64
omzet int64
rata_harga float64
dtype: objectMari kita telaah bagian penting dari kode di atas:
- Baris 3-10: DataFrame dibangun dari dictionary; kolom
produkbertipestr, tipe string bawaan pandas 3.0, sedangkan tiga kolom lainnya bertipeint64. - Baris 12:
penjualan["harga_akhir"] = penjualan["harga"] - penjualan["diskon"]mengurangkan dua kolom baris demi baris, lalu menyimpan hasilnya sebagai kolom baru bernamaharga_akhir. - Baris 13: kolom
harga_akhiryang baru saja dibuat langsung dipakai untuk perkalian dengan kolomjumlah, membuktikan bahwa kolom turunan boleh dirantai dalam operasi berikutnya. - Baris 14: ekspresi
(penjualan["harga"] + penjualan["harga_akhir"]) / 2menggabungkan penjumlahan antar kolom dan pembagian skalar dalam satu baris, lalu hasilnya menjadi kolomrata_harga.
Membaca dtype Hasil Operasi #
Bagian dtypes pada output memberi konfirmasi penting. Kolom hasil pengurangan dan perkalian antar kolom int64 tetap int64, sedangkan kolom rata_harga berubah menjadi float64 karena pembagian selalu menghasilkan float. Kolom produk tidak tersentuh operasi apa pun dan tetap bertipe str. Mengetahui dtype kolom turunan membantu kita memilih method agregasi yang tepat pada tahap berikutnya, karena beberapa method berperilaku berbeda antara tipe numerik dan teks.
Ringkasan praktis operasi semacam ini juga tersedia pada halaman 10 minutes to pandas , sedangkan aturan lengkap operator biner ada di Binary operations .
Pola Tanpa Loop Baris #
Pola kolom-ke-kolom juga membuat kode lebih mudah diuji. Satu ekspresi menghasilkan satu kolom dengan nama yang jelas, sehingga setiap langkah logika bisnis bisa ditelusuri di kode. Bandingkan dengan loop for yang menyembunyikan niat di dalam manipulasi indeks posisi; kesalahan satu nomor baris sulit terlihat oleh mata pembaca kode.
Sekarang tabel kita memiliki kolom turunan yang siap diringkas. Pertanyaan berikutnya biasanya berbentuk agregasi: berapa total omzet seluruh produk, berapa rata-rata harga, dan berapa nilai tengahnya. Chapter berikutnya menjawabnya dengan tiga method agregasi dasar: sum(), mean(), dan median().