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.

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

text
           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: object

Mari kita telaah bagian penting dari kode di atas:

  1. Baris 3-10: DataFrame dibangun dari dictionary; kolom produk bertipe str, tipe string bawaan pandas 3.0, sedangkan tiga kolom lainnya bertipe int64.
  2. Baris 12: penjualan["harga_akhir"] = penjualan["harga"] - penjualan["diskon"] mengurangkan dua kolom baris demi baris, lalu menyimpan hasilnya sebagai kolom baru bernama harga_akhir.
  3. Baris 13: kolom harga_akhir yang baru saja dibuat langsung dipakai untuk perkalian dengan kolom jumlah, membuktikan bahwa kolom turunan boleh dirantai dalam operasi berikutnya.
  4. Baris 14: ekspresi (penjualan["harga"] + penjualan["harga_akhir"]) / 2 menggabungkan penjumlahan antar kolom dan pembagian skalar dalam satu baris, lalu hasilnya menjadi kolom rata_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().