Hasil melt(), concat, atau merge sering berbentuk tabel panjang: satu baris untuk setiap kombinasi kota, bulan, dan nilai omzet. Format panjang itu enak disimpan, tetapi laporan untuk manusia biasanya butuh bentuk lebar, yaitu baris per kota dan kolom per bulan. Pandas menyediakan dua alat untuk transformasi ini: pivot() yang menuntut setiap kombinasi unik, dan pivot_table() yang dapat mengagregasi data duplikat sekaligus menambahkan total. Pada Chapter ini kita membentuk laporan penjualan tiga kota dengan keduanya dan memahami kapan masing-masing wajib dipakai.

Membentuk Tabel Lebar dengan pivot() #

DataFrame.pivot(index=..., columns=..., values=...) memetakan tiga kolom dari data panjang menjadi sumbu tabel baru: index menjadi baris, columns menjadi kolom, dan values menjadi isinya. File berikut membentuk laporan omzet per kota per bulan, lalu menunjukkan perilaku pandas ketika kombinasi kunci muncul dua kali.

python
import pandas as pd

penjualan = pd.DataFrame({
    "kota": ["Bandung", "Bandung", "Jakarta", "Jakarta",
             "Surabaya", "Surabaya"],
    "bulan": ["Jan", "Feb", "Jan", "Feb", "Jan", "Feb"],
    "omzet": [120, 135, 200, 180, 150, 160],
})

# pivot: long -> wide, satu nilai per kombinasi index/columns
lebar = penjualan.pivot(index="kota", columns="bulan", values="omzet")
print(lebar)
print()

# Kombinasi duplikat membuat pivot gagal
dup = pd.DataFrame({
    "kota": ["Bandung", "Bandung", "Jakarta"],
    "bulan": ["Jan", "Jan", "Jan"],
    "omzet": [100, 150, 200],
})
try:
    dup.pivot(index="kota", columns="bulan", values="omzet")
except ValueError as e:
    print("ValueError:", e)
print()

# pivot_table mengagregasi duplikat (default aggfunc="mean")
print(dup.pivot_table(index="kota", columns="bulan", values="omzet"))
print()

# pivot_table: aggfunc="sum", fill_value, dan margins
rekap = penjualan.pivot_table(index="kota", columns="bulan", values="omzet",
                              aggfunc="sum", fill_value=0, margins=True,
                              margins_name="Total")
print(rekap)

Output yang Dihasilkan:

text
bulan     Feb  Jan
kota              
Bandung   135  120
Jakarta   180  200
Surabaya  160  150

ValueError: Index contains duplicate entries, cannot reshape

bulan      Jan
kota          
Bandung  125.0
Jakarta  200.0

bulan     Feb  Jan  Total
kota                     
Bandung   135  120    255
Jakarta   180  200    380
Surabaya  160  150    310
Total     475  470    945

Mari kita telaah bagian-bagian pentingnya:

  1. Baris 10-13 (pivot): data enam baris berubah menjadi tabel 3x2; kota menjadi index, nilai unik bulan menjadi kolom, dan kolom bulan yang tadinya menyimpan data kini menjadi label axis bernama bulan.
  2. Baris 16-24 (ValueError): Bandung-Jan muncul dua kali (100 dan 150), dan pivot() tidak dapat memutuskan nilai mana yang diletakkan; pesan Index contains duplicate entries, cannot reshape menegaskan penyebabnya.
  3. Baris 27-28 (pivot_table): nilai duplikat diagregasi dengan aggfunc default "mean", sehingga Bandung-Jan menjadi 125.0; perhatikan hasilnya bertipe float64 karena rata-rata memang bisa pecahan.
  4. Baris 32-35: aggfunc="sum" menjumlahkan, fill_value=0 mengganti sel kosong, dan margins=True menambahkan baris serta kolom Total lewat margins_name.

Aturan Main pivot() #

Fungsi pivot() hanya dipakai ketika kombinasi index dan columns dijamin unik; pola baris “satu observasi per kombinasi” membuatnya pilihan tercepat karena tidak ada agregasi yang dihitung. Ketiga argumennya bersifat keyword-only dan hanya columns yang wajib; bila values dihilangkan, pandas membentuk MultiIndex kolom berisi semua kolom sisa, dan bila index dihilangkan, index asli tabel dipertahankan. Ada satu detail yang sering mengejutkan: label kolom hasil pivot() diurutkan berdasarkan nilai uniknya, sehingga Feb tampil sebelum Jan; bila urutan bulan penting, rapikan kembali dengan lebar[["Jan", "Feb"]] seperti contoh Chapter berikutnya. Index hasil pivot bernama sesuai kolom asalnya (kota), sehingga penelusuran lebar.loc["Bandung"] tetap nyaman.

pivot_table() untuk Data Duplikat dan Total #

pivot_table() adalah versi laporan penuh dari pivot(): kombinasi duplikat tidak lagi galat melainkan diagregasi. Nilai aggfunc menerima nama fungsi seperti "mean", "sum", "count", list berisi beberapa fungsi, maupun fungsi buatan sendiri. Kombinasi yang tidak ada di data menjadi NaN dan dapat diisi lewat fill_value, sedangkan margins=True menambahkan total baris, kolom, dan keseluruhan sekaligus; angka 945 pada sudut tabel rekap adalah jumlah seluruh omzet. Parameter dropna dan observed tersedia untuk mengatur baris ber-NaN dan kategori yang belum terpakai.

Ringkasan lengkap teknik membentuk ulang tabel ada di user guide reshaping , parameter pivot() dirinci di pandas.DataFrame.pivot , dan seluruh opsi agregasi tercantum di pandas.pivot_table . Bentuk lebar memang enak dibaca, tetapi banyak alat analisis menuntut bentuk panjang; Chapter berikutnya membahas melt(), kebalikan dari pivot.