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.

ParameterArah kerjaBentuk hasil
axis=0 (default)Menyapu ke bawah, dari baris pertama ke baris terakhirSatu nilai per kolom
axis=1Menyapu ke samping, dari kolom pertama ke kolom terakhirSatu nilai per baris
axis="index"Alias untuk axis=0Satu nilai per kolom
axis="columns"Alias untuk axis=1Satu 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.

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

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

Mari kita telaah kode di atas:

  1. Baris 3-7: kita membangun DataFrame dari dictionary dan menetapkan index=["Bandung", "Jakarta", "Surabaya"] agar setiap baris punya label gerai.
  2. Baris 8 (penjualan.index.name = "gerai"): kita memberi nama pada index sehingga header hasil agregasi terbaca rapi.
  3. Baris 12 (penjualan.sum()): tanpa argumen, sum() memakai axis=0 dan menyapu ke bawah; es_krim menghasilkan 650 karena 210 + 260 + 180.
  4. Baris 14 (penjualan.sum(axis=1)): pandas menyapu ke samping; Bandung menghasilkan 365 karena 210 + 95 + 60, dan Jakarta menghasilkan 485.
  5. Baris 16 (penjualan.mean(axis=1)): arah yang sama seperti axis=1, tetapi membagi dengan jumlah kolom; rata-rata gerai Bandung menjadi 365 / 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.