Data yang berhasil kita seleksi dari sebuah tabel jarang langsung siap dianalisis. Kita sering perlu mengubah satuan, mengurangi harga dengan diskon, atau mengalikan harga dengan jumlah terjual sebelum angka-angka itu bermakna. Di pandas, penjumlahan, pengurangan, perkalian, dan pembagian ditulis seperti ekspresi matematika biasa, tetapi operasinya diterapkan ke seluruh elemen sekaligus tanpa loop eksplisit. Chapter ini membahas operasi aritmetika dengan skalar, operasi antar Series dan antar DataFrame, serta perilaku nilai NaN yang menjadi fondasi method agregasi pada chapter-chapter berikutnya.

Operasi dengan Skalar #

Operasi dengan skalar berarti satu angka dipadankan dengan setiap elemen Series secara serentak. Ketika kita menulis harga / 2, pandas membagi setiap elemen dengan 2 dalam proses yang disebut vectorized: perhitungan berjalan di level array, bukan sekali per baris Python. Mari kita uji operasi dasar tersebut pada Series harga empat produk toko kue, lalu pada DataFrame kecil berisi dua kolom angka.

python
import pandas as pd

harga = pd.Series(
    [18000, 25000, 8000, 12000],
    index=["Bolu Pandan", "Brownies Kukus", "Donat Gula", "Roti Tawar"],
)

print(harga / 2)
print()
print(harga - 1000)
print()

terjual = pd.Series(
    [35, 20, 50, 45],
    index=["Bolu Pandan", "Brownies Kukus", "Donat Gula", "Roti Tawar"],
)
omzet = harga * terjual
print(omzet)
print()

stok = pd.Series(
    [12, None, 30, 25],
    index=["Bolu Pandan", "Brownies Kukus", "Donat Gula", "Roti Tawar"],
)
print(stok + 5)
print()

angka = pd.DataFrame({"a": [1, 2, 3], "b": [10, 20, 30]})
print(angka + 100)

Output yang Dihasilkan:

text
Bolu Pandan        9000.0
Brownies Kukus    12500.0
Donat Gula         4000.0
Roti Tawar         6000.0
dtype: float64

Bolu Pandan       17000
Brownies Kukus    24000
Donat Gula         7000
Roti Tawar        11000
dtype: int64

Bolu Pandan       630000
Brownies Kukus    500000
Donat Gula        400000
Roti Tawar        540000
dtype: int64

Bolu Pandan       17.0
Brownies Kukus     NaN
Donat Gula        35.0
Roti Tawar        30.0
dtype: float64

     a    b
0  101  110
1  102  120
2  103  130

Mari kita telaah baris demi baris apa yang dilakukan kode di atas:

  1. Baris 3-6 (harga = pd.Series(...)): kita membuat Series berisi harga empat produk; parameter index memberi label produk pada setiap nilai sehingga hasil operasi tetap mudah dibaca.
  2. Baris 8-10: harga / 2 membagi setiap elemen dengan 2 dan mengembalikan Series baru ber-dtype float64, sedangkan harga - 1000 mengurangi setiap elemen dengan 1000; Series harga asli tidak berubah.
  3. Baris 13-18 (omzet = harga * terjual): pandas memasangkan elemen kedua Series berdasarkan label index yang sama lalu mengalikannya, sehingga omzet per produk terhitung tanpa satu pun loop.
  4. Baris 21-25: Series stok memuat None pada label Brownies Kukus; hasil stok + 5 menunjukkan NaN pada label tersebut karena angka 5 tidak punya pasangan untuk dijumlahkan.
  5. Baris 28-29 (angka + 100): pada DataFrame, operasi skalar diterapkan ke setiap sel, sehingga kolom a menjadi 101, 102, 103 dan kolom b menjadi 110, 120, 130 sekaligus.

Perhatikan dtype pada hasil. harga / 2 menghasilkan float64 meskipun semua hasilnya bilangan bulat, karena pembagian di pandas selalu menghasilkan float. Sebaliknya, harga - 1000 dan harga * terjual mempertahankan int64 karena kedua operannya integer. Detail ini penting ketika kita merangkai operasi panjang, karena dtype hasil menentukan operasi apa yang sah dilakukan berikutnya.

Operasi Antar Series dan Antar DataFrame #

Ketika dua Series dijumlahkan atau dikalikan, pandas memasangkan nilainya berdasarkan label index, bukan berdasarkan posisi. Mekanisme ini disebut alignment: pandas menyusun gabungan semua label dari kedua Series, mengoperasikan pasangan yang cocok, dan mengisi label tanpa pasangan dengan NaN. Pada perhitungan omzet di atas, kedua Series memakai label produk yang sama persis sehingga setiap elemen menemukan pasangannya. Jika labelnya berbeda, hasil akan berisi NaN pada label yang tidak bertemu pasangan, sehingga konsistensi label menjadi krusial ketika kita menggabungkan data dari dua sumber.

Pada DataFrame, alignment berlaku untuk label baris dan nama kolom sekaligus. Pola paling umum dalam pekerjaan harian tetap operasi antar dua kolom yang nama-namanya kita sebutkan eksplisit, dan pola itu dibedah tuntas pada chapter berikutnya. Dokumentasi resmi yang merangkum semua operator biner adalah halaman Binary operations ; alternatif method-nya seperti add(), sub(), mul(), dan div() bisa ditelusuri dari referensi pandas.Series.add .

Perilaku NaN pada Operasi Aritmetika #

Nilai NaN berperilaku berbeda pada operasi biner dibandingkan pada method agregasi. Dalam operasi biner seperti stok + 5, NaN tidak diabaikan melainkan menular: setiap sel yang berisi NaN menghasilkan NaN pada output. Perilaku ini logis karena pandas tidak dapat menebak nilai apa yang menggantikan data yang belum terisi. Karena itu, tangani NaN terlebih dulu sebelum menghitung, misalnya dengan fillna() untuk mengisi nilai tertentu atau dropna() untuk memilih baris yang lengkap.

Operasi satu kolom dengan skalar hanyalah langkah pertama. Pada pekerjaan nyata, kolom baru biasanya lahir dari kombinasi beberapa kolom sekaligus, misalnya harga dikurangi diskon lalu dikalikan jumlah. Chapter berikutnya membahas pola itu secara khusus: membangun kolom turunan dengan operasi antar kolom.