TL;DR
pandas melt ngubah DataFrame dari bentuk wide (banyak kolom) jadi long (banyak baris). Kamu tentuin id_vars sebagai kolom yang dipertahankan, dan sisanya dilebur jadi dua kolom baru: satu berisi nama kolom lama (variable), satu berisi nilainya (value). Bentuk long ini yang dibutuhin kebanyakan library visualisasi dan fungsi groupby, jadi melt sering jadi langkah wajib sebelum analisa.
pandas melt ngubah DataFrame dari bentuk wide (banyak kolom) jadi long (banyak baris) cuma dalam satu baris kode.
Data laporan sering datang dalam bentuk wide: satu kolom per bulan, satu kolom per cabang. Enak dibaca mata, tapi bikin repot pas mau di-groupby atau dibikin chart. melt ngerapiin ke bentuk yang komputer suka.
Di bawah ini cara pakainya dari dasar, plus kapan kamu butuh melt dan kapan butuh kebalikannya.
melt adalah fungsi pandas yang ngubah DataFrame dari wide jadi long. Bentuk wide punya banyak kolom nilai. melt ngelebur kolom-kolom itu jadi dua kolom baru: satu berisi nama kolom aslinya, satu berisi nilainya. Hasilnya tabel yang lebih tinggi dan sempit.
Kenapa penting? Karena kebanyakan library visualisasi dan fungsi analisa maunya data long. Jadi melt sering jadi langkah wajib sebelum kerjaan sebenernya mulai. Ini bagian rutin dari data wrangling.
Gampangnya lewat contoh. Data wide penjualan:
| produk | Jan | Feb | Mar |
|---|---|---|---|
| Beras | 120 | 135 | 128 |
| Gula | 80 | 92 | 88 |
Bentuk long-nya:
| produk | bulan | omzet |
|---|---|---|
| Beras | Jan | 120 |
| Beras | Feb | 135 |
| Gula | Jan | 80 |
Wide enak dibaca manusia. Long enak diproses komputer buat groupby, filter, dan chart. Analis sering nerima wide lalu ngubahnya jadi long.
Tentuin kolom identitas yang mau dipertahankan lewat id_vars. Sisanya dilebur otomatis.
import pandas as pd
df_long = df.melt(
id_vars="produk",
var_name="bulan",
value_name="omzet"
)
id_vars="produk" bilang kolom produk jangan dilebur, ulangi aja di tiap baris. var_name dan value_name ngasih nama kolom hasil. Tanpa keduanya, pandas kasih nama default "variable" dan "value" yang kurang jelas.
Hasilnya: tiap produk sekarang punya satu baris per bulan. Kolom Jan, Feb, Mar lenyap, digantikan kolom bulan dan omzet.
Kadang kamu cuma mau lebur sebagian kolom, bukan semua. Pakai value_vars.
df_long = df.melt(
id_vars="produk",
value_vars=["Jan", "Feb"],
var_name="bulan",
value_name="omzet"
)
Ini cuma nglebur kolom Jan dan Feb. Kolom Mar diabaikan. Berguna kalau tabelmu punya campuran kolom yang mau dilebur dan yang mau dibuang.
Kamu juga bisa kasih beberapa kolom di id_vars, misalnya id_vars=["produk", "cabang"], kalau ada lebih dari satu kolom identitas yang perlu dipertahankan.
Kebalikannya pivot atau pivot_table. melt ngubah wide jadi long, pivot ngubah long balik jadi wide.
df_wide = df_long.pivot_table(
index="produk",
columns="bulan",
values="omzet"
)
Alurnya sering bolak-balik: melt buat proses dan analisa, pivot_table buat nyajiin hasil akhir ke bentuk laporan. Aku bahas pivot_table lengkap di Pandas pivot_table.
toko_berkah punya file rekap penjualan bulanan dalam bentuk wide: satu baris per produk, 6 kolom bulan dari Januari sampai Juni 2026. Total 340 produk. Bentuk ini enak buat dicetak, tapi susah buat dianalisa.
Buat cari produk dengan tren naik, aku ubah dulu jadi long:
df_long = df.melt(
id_vars="produk",
var_name="bulan",
value_name="omzet"
)
Dari 340 baris wide, hasilnya 2.040 baris long (340 produk kali 6 bulan). Begitu jadi long, groupby dan chart tren jadi gampang.
Satu temuan dari data ini: 23 produk punya omzet yang naik terus 6 bulan berturut-turut, dan 18 di antaranya kategori makanan ringan. Pola itu gak akan kelihatan dari tabel wide, karena mata susah bandingin tren antar 340 baris. Setelah long, satu groupby udah cukup buat munculin daftarnya. Alur kayak gini bagian dari tahap persiapan data di kerangka CRISP-DM.
Lupa id_vars. Kalau id_vars gak diisi, semua kolom dilebur, termasuk kolom identitas. Nama produk ikut jadi nilai, dan datanya jadi kacau.
Biarin nama default. Kolom "variable" dan "value" bikin kode berikutnya susah dibaca. Selalu kasih var_name dan value_name yang bermakna.
Melt kolom yang tipe datanya campur. Kalau kolom yang dilebur ada yang teks dan ada yang angka, kolom value hasilnya jadi tipe object. Pastiin kolom yang dilebur tipenya seragam.
Lupa data jadi jauh lebih panjang. Wide 340 baris bisa jadi long ribuan baris. Buat data besar, cek dulu ukurannya biar gak makan memori berlebih.
melt adalah fungsi pandas yang ngubah DataFrame dari bentuk wide jadi long. Bentuk wide punya banyak kolom, misalnya satu kolom per bulan. melt ngelebur kolom-kolom itu jadi dua kolom baru: satu berisi nama kolom aslinya, satu berisi nilainya. Hasilnya tabel yang lebih tinggi dan sempit. Bentuk long ini yang dibutuhin kebanyakan tools visualisasi dan analisa, jadi melt sering jadi langkah persiapan.
Data wide nyebar nilai ke banyak kolom, misalnya kolom Jan, Feb, Mar masing-masing berisi omzet. Data long numpuk nilai itu ke bawah, jadi ada kolom bulan dan kolom omzet, satu baris per kombinasi. Wide enak dibaca manusia di laporan. Long enak diproses komputer buat groupby, filter, dan chart. Analis sering nerima data wide lalu ngubahnya jadi long pakai melt sebelum diolah.
id_vars adalah daftar kolom yang mau dipertahankan apa adanya, gak ikut dilebur. Biasanya ini kolom identitas kayak nama produk, cabang, atau tanggal. Kolom di id_vars bakal diulang di tiap baris hasil melt, jadi tiap nilai tetap kebawa konteksnya. Kolom yang gak masuk id_vars bakal dilebur jadi pasangan variable dan value, kecuali kamu batasi lewat value_vars.
Pakai argumen var_name dan value_name. var_name ngasih nama buat kolom yang berisi nama kolom lama, value_name buat kolom nilainya. Contoh: df.melt(id_vars='produk', var_name='bulan', value_name='omzet'). Tanpa ini, pandas kasih nama default 'variable' dan 'value' yang kurang jelas. Selalu kasih nama yang bermakna biar hasilnya langsung kebaca dan gampang dipakai di langkah berikutnya.
Kebalikannya pivot atau pivot_table. melt ngubah wide jadi long, pivot ngubah long balik jadi wide. Kalau kamu udah melt data lalu mau nampilin jadi tabel silang buat laporan, pakai pivot_table buat nyusunnya lagi. Dua fungsi ini sering dipakai bergantian: melt buat proses dan analisa, pivot_table buat nyajiin hasil akhir ke bentuk yang enak dibaca.
Ringkasnya:
df.melt(id_vars=...) ngubah wide jadi long, kolom identitas dipertahankan lewat id_vars.Ambil satu file rekap bulanan yang bentuknya wide, panggil df.melt() dengan kolom identitasnya, dan lihat data kamu berubah jadi bentuk yang siap dianalisa. Sekali paham polanya, melt jadi refleks tiap terima data laporan.
Mau ngerti konsep DataFrame dan tidy data lebih dalam? Cek glossary DataFrame dan glossary tidy data. Dokumentasi resmi melt ada di situs pandas.
Mau praktek langsung? Mulai latihan SQL gratis
Latihan interaktif, langsung di browser.
Nama toko ketik campur huruf besar-kecil, spasi nyasar di ujung, atau kode produk nempel jadi satu. Accessor .str di pandas ngerapiin semua itu tanpa loop.
Model machine learning cuma ngerti angka, bukan teks kayak merah atau biru. get_dummies ngubah kolom kategori jadi kolom 0/1 dalam satu baris kode.
Cara pakai pandas crosstab buat bikin tabel silang yang menghitung frekuensi antar dua kategori. Contoh analisis kategori produk per kota UMKM.