---
title: pandas melt — แปลงตารางจากแนวกว้างเป็นแนวยาว (Unpivot)
url: https://www.thepexcel.com/functions/python/transform/pandas-melt/
type: function-explainer
program: Python
syntax: "pd.melt(frame, id_vars, value_vars, var_name, value_name)"
date: 2026-05-31
scores:
  popularity: 5
  difficulty: 3
  usefulness: 5
---

# pandas melt — แปลงตารางจากแนวกว้างเป็นแนวยาว (Unpivot)

> pd.melt ผมใช้แปลงตารางจากแนวกว้าง (wide) ให้เป็นแนวยาว (long) คือยุบหลายๆ คอลัมน์ให้มารวมกันเป็นคอลั

## คำอธิบาย

pd.melt ผมใช้แปลงตารางจากแนวกว้าง (wide) ให้เป็นแนวยาว (long) คือยุบหลายๆ คอลัมน์ให้มารวมกันเป็นคอลัมน์เดียว ถ้าใครเคยใช้ Power Query มาก่อน บอกเลยว่านี่คือคำสั่ง Unpivot นั่นแหละครับ แค่ย้ายมาเขียนใน pandas

## Syntax

```excel
pd.melt(frame, id_vars, value_vars, var_name, value_name)
```

## Arguments

| Name | Required | Type | Default | Description |
| --- | --- | --- | --- | --- |
| frame | Yes | DataFrame |  | DataFrame ต้นทางที่อยู่ในรูปแบบ wide ที่เราอยากแปลงให้เป็น long |
| id_vars | No | str \| list | None | คอลัมน์ที่ตรึงไว้ ไม่ต้องยุบ เช่น 'name' หรือ ['name', 'team'] — เหมือนคอลัมน์ที่ไม่ได้เลือกตอน Unpivot ใน Power Query |
| value_vars | No | str \| list | None | คอลัมน์ที่จะยุบลงมารวมกัน เช่น ['Q1', 'Q2', 'Q3'] ถ้าไม่ระบุ pandas จะยุบทุกคอลัมน์ที่ไม่ได้อยู่ใน id_vars ให้เอง |
| var_name | No | str | 'variable' | ชื่อคอลัมน์ใหม่ที่เก็บชื่อคอลัมน์เดิม (เช่น Q1, Q2, Q3) ถ้าไม่ตั้งจะได้ชื่อ default ว่า variable |
| value_name | No | str | 'value' | ชื่อคอลัมน์ใหม่ที่เก็บค่าตัวเลขที่ยุบลงมา ถ้าไม่ตั้งจะได้ชื่อ default ว่า value |

## ตัวอย่าง

### 1. ตัวอย่างที่ 1: Unpivot พื้นฐานด้วย id_vars

```excel
pd.melt(df, id_vars='name')
```

**ผลลัพธ์:** `  name variable  value
0  Ann       Q1     80
1  Bob       Q1     70
2  Ann       Q2     85
3  Bob       Q2     75
4  Ann       Q3     90
5  Bob       Q3     65`

ผมตรึงคอลัมน์ name ไว้ด้วย id_vars แล้วปล่อยให้ melt ยุบคอลัมน์ที่เหลือ (Q1, Q2, Q3) ลงมาเองทั้งหมด ตารางจาก 2 แถวเลยกลายเป็น 6 แถว แต่ละคนมี 3 แถวตามจำนวนไตรมาส คอลัมน์ variable บอกว่าเป็นไตรมาสไหน ส่วน value เก็บคะแนน — นี่คือ Unpivot แบบเป๊ะๆ ครับ

### 2. ตัวอย่างที่ 2: เลือกเฉพาะบางคอลัมน์ด้วย value_vars

```excel
pd.melt(df, id_vars='name', value_vars=['Q1', 'Q2'])
```

**ผลลัพธ์:** `  name variable  value
0  Ann       Q1     80
1  Bob       Q1     70
2  Ann       Q2     85
3  Bob       Q2     75`

คราวนี้ผมไม่อยากยุบทุกคอลัมน์ครับ เลยระบุ value_vars=['Q1', 'Q2'] บอกชัดว่าจะยุบแค่ Q1 กับ Q2 — คอลัมน์ Q3 จะถูกตัดทิ้งไปเลยไม่ติดมาด้วย เหมาะตอนตารางต้นทางมีคอลัมน์เยอะแต่เราสนใจแค่บางตัว

### 3. ตัวอย่างที่ 3: ตั้งชื่อคอลัมน์ผลลัพธ์ด้วย var_name / value_name

```excel
pd.melt(df, id_vars='name', var_name='quarter', value_name='score')
```

**ผลลัพธ์:** `  name quarter  score
0  Ann      Q1     80
1  Bob      Q1     70
2  Ann      Q2     85
3  Bob      Q2     75
4  Ann      Q3     90
5  Bob      Q3     65`

ชื่อ default ว่า variable กับ value มันดูไม่สื่อความหมายครับ ผมเลยตั้งชื่อใหม่ผ่าน var_name='quarter' และ value_name='score' ทำให้ตารางผลลัพธ์อ่านรู้เรื่องทันทีว่าคอลัมน์ไหนคือไตรมาส คอลัมน์ไหนคือคะแนน อันนี้ผมแนะนำให้ตั้งทุกครั้งเลย

## หมายเหตุเพิ่มเติม

- 💡 ผมแนะนำให้ตั้ง var_name กับ value_name ทุกครั้งครับ ชื่อ default ว่า 'variable'/'value' มันไม่สื่อ พอตั้งชื่อให้ตรงความหมาย (เช่น quarter/score) โค้ดที่เขียนต่อจะอ่านง่ายขึ้นเยอะ

- ถ้าอยากให้ melt แล้วได้ผลเรียงสวยตามคน ลองต่อท้ายด้วย .sort_values('name') ครับ เพราะ default มันจะเรียงตามคอลัมน์ที่ยุบ (Q1 ทุกคนก่อน แล้วค่อย Q2) ซึ่งบางทีอ่านยาก

- melt มักเป็นด่านแรกของ pipeline ครับ ส่วนตัวผมชอบ melt ให้เป็น long ก่อน แล้วค่อยส่งต่อให้ groupby สรุปผล เพราะ groupby ทำงานกับข้อมูลทรง long ได้ลื่นที่สุด

## คำถามที่พบบ่อย

**Q: melt ต่างจาก pivot_table ยังไง อันไหนใช้ตอนไหน?**

สองตัวนี้คือคู่ตรงข้ามกันครับ 😎 melt = ยุบ (wide → long) ส่วน pivot_table = กาง (long → wide) ถ้าข้อมูลคุณมีคอลัมน์ Q1 Q2 Q3 แยกกันแล้วอยากยุบรวม ใช้ melt แต่ถ้ามีข้อมูลทรงยาวอยู่แล้วอยากกางออกเป็นตารางไขว้ ใช้ pivot_table ส่วนตัวผมมัก melt ก่อนเพื่อจัดทรงข้อมูลดิบ แล้วค่อย pivot_table ตอนทำรายงานสรุปครับ

**Q: ถ้าไม่ใส่ id_vars เลยจะเกิดอะไรขึ้น?**

melt จะยุบ "ทุกคอลัมน์" ลงมาเป็นแค่ 2 คอลัมน์ (variable กับ value) เลยครับ ไม่มีคอลัมน์ไหนถูกตรึงไว้ ผลคือคุณจะเสีย context ว่าแต่ละค่ามาจากแถวไหน เพราะงั้นถ้าตารางมีคอลัมน์ระบุตัวตน เช่น ชื่อคน รหัสสินค้า ผมแนะนำให้ใส่ใน id_vars เสมอครับ ไม่งั้นข้อมูลจะปนกันมั่ว

**Q: เทียบกับ Unpivot ใน Power Query แล้ว ตรงกันแค่ไหน?**

ตรงกันเกือบ 100% เลยครับ id_vars ก็คือคอลัมน์ที่คุณ "ไม่ได้เลือก" ตอน Unpivot, value_vars คือคอลัมน์ที่คุณ "เลือก Unpivot", ส่วน var_name/value_name ก็คือชื่อคอลัมน์ Attribute/Value ที่ Power Query สร้างให้นั่นแหละ ใครคุ้น Power Query อยู่แล้วจับ melt ได้ภายในนาทีเดียวครับ

## แหล่งข้อมูลเพิ่มเติม

- [pandas.melt (official docs)](https://pandas.pydata.org/docs/reference/api/pandas.melt.html) _(article)_

---

_Source: [https://www.thepexcel.com/functions/python/transform/pandas-melt/](https://www.thepexcel.com/functions/python/transform/pandas-melt/)_
