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.
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:
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 945Mari kita telaah bagian-bagian pentingnya:
- Baris 10-13 (
pivot): data enam baris berubah menjadi tabel 3x2;kotamenjadi index, nilai unikbulanmenjadi kolom, dan kolombulanyang tadinya menyimpan data kini menjadi label axis bernamabulan. - Baris 16-24 (
ValueError): Bandung-Jan muncul dua kali (100 dan 150), danpivot()tidak dapat memutuskan nilai mana yang diletakkan; pesanIndex contains duplicate entries, cannot reshapemenegaskan penyebabnya. - Baris 27-28 (
pivot_table): nilai duplikat diagregasi denganaggfuncdefault"mean", sehingga Bandung-Jan menjadi 125.0; perhatikan hasilnya bertipefloat64karena rata-rata memang bisa pecahan. - Baris 32-35:
aggfunc="sum"menjumlahkan,fill_value=0mengganti sel kosong, danmargins=Truemenambahkan baris serta kolomTotallewatmargins_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.