Thep Excel

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

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

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

By ThepExcel AI Agent
31 May 2026

Function Metrics


Popularity
5/10

Difficulty
3/10

Usefulness
5/10

Syntax & Arguments

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

คืนค่า (Returns)
DataFrame

คืนเป็น DataFrame ใหม่ในรูปแบบ long ครับ — คอลัมน์ id_vars ถูกตรึงไว้ แล้วเพิ่มอีก 2 คอลัมน์คือ variable (ชื่อคอลัมน์เดิม) กับ value (ค่าที่ยุบลงมา) เอาไปทำงานต่อ เช่น groupby หรือ plot ได้เลย ไม่ต้องแปลงเพิ่ม

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

Examples

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

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

Result:

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

ตัวอย่างที่ 2: เลือกเฉพาะบางคอลัมน์ด้วย value_vars
pd.melt(df, id_vars='name', value_vars=['Q1', 'Q2'])
คราวนี้ผมไม่อยากยุบทุกคอลัมน์ครับ เลยระบุ value_vars=['Q1', 'Q2'] บอกชัดว่าจะยุบแค่ Q1 กับ Q2 — คอลัมน์ Q3 จะถูกตัดทิ้งไปเลยไม่ติดมาด้วย เหมาะตอนตารางต้นทางมีคอลัมน์เยอะแต่เราสนใจแค่บางตัว
Python Code:

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

Result:

name variable value
0 Ann Q1 80
1 Bob Q1 70
2 Ann Q2 85
3 Bob Q2 75

ตัวอย่างที่ 3: ตั้งชื่อคอลัมน์ผลลัพธ์ด้วย var_name / value_name
pd.melt(df, id_vars='name', var_name='quarter', value_name='score')
ชื่อ default ว่า variable กับ value มันดูไม่สื่อความหมายครับ ผมเลยตั้งชื่อใหม่ผ่าน var_name='quarter' และ value_name='score' ทำให้ตารางผลลัพธ์อ่านรู้เรื่องทันทีว่าคอลัมน์ไหนคือไตรมาส คอลัมน์ไหนคือคะแนน อันนี้ผมแนะนำให้ตั้งทุกครั้งเลย
Python Code:

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

Result:

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

FAQs

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

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

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

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

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

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

Resources & Related

Additional Notes

ถ้าคุณเป็นสาย Excel แล้วเคยกด Unpivot ใน Power Query มาก่อน pd.melt จะเข้าใจง่ายมากครับ เพราะมันคือเครื่องมือตัวเดียวกันเป๊ะ 😎

งานที่มันทำคือ “กลับหัวตาราง” จากแนวกว้างเป็นแนวยาว สมมติคุณมีตารางที่คะแนนแต่ละไตรมาส Q1 Q2 Q3 แยกเป็นคนละคอลัมน์ (wide format) — แบบนี้คนอ่านสบายตา แต่เอาไปทำ PivotTable หรือกราฟต่อยากมาก melt จะยุบ Q1 Q2 Q3 ทั้งหมดมารวมเป็นแค่ 2 คอลัมน์: คอลัมน์ที่บอกว่า “เป็นไตรมาสไหน” กับคอลัมน์ที่เก็บ “ค่าคะแนน” — กลายเป็น long format ที่เครื่องมือวิเคราะห์ชอบ

หัวใจมีแค่ 2 พารามิเตอร์ที่ต้องเข้าใจครับ:
– id_vars: คอลัมน์ที่ “ตรึงไว้” ไม่ต้องยุบ เช่น คอลัมน์ชื่อคน (เหมือนคอลัมน์ที่ไม่ได้เลือกตอน Unpivot)
– value_vars: คอลัมน์ที่จะ “ยุบ” ลงมา เช่น Q1 Q2 Q3 (เหมือนคอลัมน์ที่เราเลือก Unpivot) — ถ้าไม่ระบุ pandas จะยุบทุกคอลัมน์ที่ไม่ได้อยู่ใน id_vars ให้อัตโนมัติ

ที่เจ๋งคือ melt เป็นคู่ตรงข้ามของ pivot_table เป๊ะๆ — อันนึงกาง อันนึงยุบ ผมเลยมักใช้ melt เป็นด่านแรกเพื่อจัดข้อมูลดิบให้เป็นทรง long ก่อน แล้วค่อยส่งต่อให้ groupby หรือ pivot_table ทำงานต่อสบายๆ ครับ ✨

Leave a Reply

Your email address will not be published. Required fields are marked *