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.
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:
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 130Mari kita telaah baris demi baris apa yang dilakukan kode di atas:
- Baris 3-6 (
harga = pd.Series(...)): kita membuat Series berisi harga empat produk; parameterindexmemberi label produk pada setiap nilai sehingga hasil operasi tetap mudah dibaca. - Baris 8-10:
harga / 2membagi setiap elemen dengan 2 dan mengembalikan Series baru ber-dtypefloat64, sedangkanharga - 1000mengurangi setiap elemen dengan 1000; Serieshargaasli tidak berubah. - Baris 13-18 (
omzet = harga * terjual): pandas memasangkan elemen kedua Series berdasarkan labelindexyang sama lalu mengalikannya, sehingga omzet per produk terhitung tanpa satu pun loop. - Baris 21-25: Series
stokmemuatNonepada label Brownies Kukus; hasilstok + 5menunjukkanNaNpada label tersebut karena angka 5 tidak punya pasangan untuk dijumlahkan. - Baris 28-29 (
angka + 100): pada DataFrame, operasi skalar diterapkan ke setiap sel, sehingga kolomamenjadi 101, 102, 103 dan kolombmenjadi 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.