Pada Chapter-Chapter sebelumnya kita memanggil sum(), mean(), var(), dan corr() tanpa memikirkan arah kerjanya. Padahal pada DataFrame, satu jenis perhitungan bisa dijalankan ke bawah (menyapu baris dalam satu kolom) atau ke samping (menyapu kolom dalam satu baris). Parameter axis yang tersedia di hampir semua method agregat pandas mengatur arah tersebut. Pada Chapter ini kita membedakan axis=0 dan axis=1 memakai data penjualan tiga gerai, sehingga perbedaan arah terlihat jelas dari bentuk hasilnya.
Dua Arah Agregasi pada DataFrame #
Agregasi berarti memadatkan banyak nilai menjadi satu nilai ringkas. Ketika kita menjumlahkan kolom es_krim dari tiga gerai, kita memadatkan tiga angka menjadi satu; ketika kita menjumlahkan seluruh produk milik gerai Bandung, kita juga memadatkan tiga angka menjadi satu. Yang membedakan keduanya hanya arah penyapuan, dan parameter axis yang menentukannya.
| Parameter | Arah kerja | Bentuk hasil |
|---|---|---|
axis=0 (default) | Menyapu ke bawah, dari baris pertama ke baris terakhir | Satu nilai per kolom |
axis=1 | Menyapu ke samping, dari kolom pertama ke kolom terakhir | Satu nilai per baris |
axis="index" | Alias untuk axis=0 | Satu nilai per kolom |
axis="columns" | Alias untuk axis=1 | Satu nilai per baris |
Cara membaca yang paling aman adalah dengan melihat bentuk hasilnya. axis=0 memadatkan data sepanjang index sehingga index hasilnya berisi nama kolom. axis=1 memadatkan data sepanjang kolom sehingga index hasilnya berisi label baris. Dengan aturan ini, kita tidak perlu menghafal arah panah; cukup tanyakan “index hasilnya berisi apa”.
Membandingkan axis=0 dan axis=1 pada Data Penjualan #
Kita siapkan DataFrame kecil berisi penjualan tiga produk di tiga gerai. Label index memakai nama kota lokasi gerai, sehingga setiap baris mewakili satu gerai dan setiap kolom mewakili satu produk. Dengan tabel yang kecil, arah perhitungan bisa kita periksa secara manual.
import pandas as pd
penjualan = pd.DataFrame({
"es_krim": [210, 260, 180],
"jus": [95, 140, 110],
"teh": [60, 85, 75],
}, index=["Bandung", "Jakarta", "Surabaya"])
penjualan.index.name = "gerai"
print(penjualan)
print()
print(penjualan.sum())
print()
print(penjualan.sum(axis=1))
print()
print(penjualan.mean(axis=1))Output yang Dihasilkan:
es_krim jus teh
gerai
Bandung 210 95 60
Jakarta 260 140 85
Surabaya 180 110 75
es_krim 650
jus 345
teh 220
dtype: int64
gerai
Bandung 365
Jakarta 485
Surabaya 365
dtype: int64
gerai
Bandung 121.666667
Jakarta 161.666667
Surabaya 121.666667
dtype: float64Mari kita telaah kode di atas:
- Baris 3-7: kita membangun DataFrame dari dictionary dan menetapkan
index=["Bandung", "Jakarta", "Surabaya"]agar setiap baris punya label gerai. - Baris 8 (
penjualan.index.name = "gerai"): kita memberi nama pada index sehingga header hasil agregasi terbaca rapi. - Baris 12 (
penjualan.sum()): tanpa argumen,sum()memakaiaxis=0dan menyapu ke bawah;es_krimmenghasilkan650karena210 + 260 + 180. - Baris 14 (
penjualan.sum(axis=1)): pandas menyapu ke samping;Bandungmenghasilkan365karena210 + 95 + 60, danJakartamenghasilkan485. - Baris 16 (
penjualan.mean(axis=1)): arah yang sama sepertiaxis=1, tetapi membagi dengan jumlah kolom; rata-rata gerai Bandung menjadi365 / 3 = 121.666667.
Dua angka 650 dan 365 menjawab dua pertanyaan bisnis yang berbeda. Angka 650 adalah total gelas es krim dari seluruh gerai (pertanyaan per produk), sedangkan 365 adalah total penjualan gerai Bandung dari semua produk (pertanyaan per gerai). Satu method yang sama, sum(), menjawab keduanya hanya karena arah axis-nya berbeda. Perhatikan juga bahwa dtype: int64 muncul pada hasil penjumlahan, sementara mean() menghasilkan float64 karena pembagian.
Memilih Arah dengan Benar #
Kesalahan yang paling sering terjadi adalah mengira axis=0 berarti “operasi pada baris” karena angkanya merujuk baris. Padahal axis=0 berarti arah index: nilai-nilai sepanjang index yang dipadatkan, sehingga hasilnya per kolom. Alih-alih menghafal, cocokkan selalu rencana kita dengan tabel bentuk hasil di atas, lalu verifikasi dengan data kecil seperti contoh di atas sebelum menerapkannya pada data besar.
Aturan arah yang sama berlaku ketika kita memanggil min(), max(), std(), atau count() pada DataFrame, sehingga pemahaman di Chapter ini terpakai berulang-ulang. Dokumentasi pandas.DataFrame.sum
menjelaskan parameter axis beserta aliasnya secara lengkap, dan halaman Essential basic functionality
memperlihatkan pola yang sama untuk agregat lainnya.
Agregasi memadatkan data menjadi satu angka per arah. Chapter berikutnya memperkenalkan keluarga method yang justru mempertahankan panjang data: operasi kumulatif cumsum(), cummax(), dan cummin() yang melacak nilai berjalan dari baris pertama hingga terakhir.