pythonpandasreshapeMahir6 mnt baca

Mengubah Bentuk Data: pivot dan melt

Bangun tabel ringkasan dengan pivot_table() dan aggfunc, kembalikan data wide menjadi long dengan melt(), dan pahami kapan tiap bentuk dipakai di laporan.

Bentuk Data Menentukan Pertanyaannya

Data yang sama bisa disajikan dalam dua bentuk: long (satu baris per observasi, kolomnya sedikit) dan wide (kolomnya banyak, tiap kolom satu periode atau kategori). Ini seperti foto yang sama dilihat portrait atau landscape, isinya sama tapi yang terlihat jelas berbeda. pivot_table() mengubah long menjadi wide agar enak dibaca manusia, sedangkan melt() mengubah wide menjadi long agar enak diolah mesin.

Untuk data analyst, dua fungsi ini adalah jembatan antara analisis dan laporan. Atasan ingin melihat tabel ringkas omzet per kategori per bulan (wide, hasil pivot), tapi untuk membuat grafik tren di library visualisasi, data harus berbentuk long (hasil melt). Bisa berpindah bentuk dengan luwes adalah tanda analis yang sudah naik level.

pivot_table(): Dari Baris Transaksi ke Tabel Laporan

python
import pandas as pd

df = pd.DataFrame({
    "bulan": ["Jan", "Jan", "Feb", "Feb", "Jan", "Feb"],
    "kategori": ["Kopi", "Teh", "Kopi", "Teh", "Kopi", "Teh"],
    "omzet": [500, 300, 700, 400, 600, 350],
})

laporan = df.pivot_table(index="kategori", columns="bulan",
                         values="omzet", aggfunc="sum")
print(laporan)

Parameter kuncinya: index menjadi baris, columns menjadi kolom, values adalah angka yang diagregasi, dan aggfunc menentukan cara agregasinya (sum, mean, count, dan lain-lain). Hasilnya persis seperti tabel pivot di Excel yang biasa diminta atasan.

melt(): Dari Tabel Wide Kembali ke Long

Seringkali data datang dalam bentuk wide, misalnya satu kolom per bulan, dan kamu butuh bentuk long untuk analisis lanjutan.

python
import pandas as pd

wide = pd.DataFrame({
    "kategori": ["Kopi", "Teh"],
    "Jan": [1100, 650],
    "Feb": [700, 750],
    "Mar": [900, 800],
})

long = wide.melt(id_vars=["kategori"],
                 var_name="bulan",
                 value_name="omzet")
print(long)
# Lanjut analisis: total per bulan
print(long.groupby("bulan")["omzet"].sum())

id_vars adalah kolom yang dipertahankan sebagai identitas baris, sedangkan kolom-kolom bulan "dilelehkan" menjadi dua kolom baru: bulan dan omzet. Dari bentuk long ini, groupby dan visualisasi jadi mudah. Inilah alasan analis senior selalu menyimpan data mentah dalam bentuk long: satu bentuk yang bisa diubah menjadi laporan apa pun.

Catatan teknis: pivot() (tanpa _table) akan error kalau ada kombinasi index dan columns yang duplikat, karena dia tidak tahu cara menggabungkannya. pivot_table() aman dari masalah ini justru karena kamu wajib menentukan aggfunc.

Jebakan Umum

SALAH: memakai pivot() di data transaksi yang punya duplikat kombinasi.

python
df.pivot(index="kategori", columns="bulan", values="omzet")  # ValueError: duplikat

BENAR: pakai pivot_table() dengan aggfunc yang eksplisit.

python
df.pivot_table(index="kategori", columns="bulan",
               values="omzet", aggfunc="sum")

SALAH: melt tanpa id_vars sehingga kolom identitas ikut meleleh.

python
wide.melt()  # kolom 'kategori' ikut jadi baris data, berantakan

BENAR: tentukan id_vars dengan jelas supaya hanya kolom periode yang dilelehkan, dan beri nama baru yang bermakna lewat var_name dan value_name.

Tantangan

Susun Laporan Bulanan

Diberikan DataFrame transaksi long (tanggal, kategori, omzet). Buat pivot_table omzet per kategori per bulan dengan aggfunc sum, lalu melt hasilnya kembali ke bentuk long dengan kolom bulan dan omzet.