Thep Excel

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

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

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

ความนิยม5/10
ความยาก3/10
ประโยชน์5/10

อัปเดต 31 May 2026

Syntax & Arguments

คืนค่าDataFrame

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

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

[ ] = อาร์กิวเมนต์ที่ไม่บังคับ

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 ทำงานต่อสบายๆ ครับ ✨

Examples

ตัวอย่างที่ 1: Unpivot พื้นฐานด้วย id_varspd.melt(df, id_vars='name')

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

>_
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
ตัวอย่างที่ 2: เลือกเฉพาะบางคอลัมน์ด้วย value_varspd.melt(df, id_vars='name', value_vars=['Q1', 'Q2'])

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

>_
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
ตัวอย่างที่ 3: ตั้งชื่อคอลัมน์ผลลัพธ์ด้วย var_name / value_namepd.melt(df, id_vars='name', var_name='quarter', value_name='score')

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

>_
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

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

ฟังก์ชันที่ผู้เขียนโยงไว้กับ pandas melt จัดกลุ่มตามหมวด · ชี้ที่ชื่อใดชื่อหนึ่ง แล้วฟังก์ชันที่ใช้คู่กันจะมีจุดทอง

ฟังก์ชันนี้pandas meltTransform
Aggregation (2)
pandas groupby

groupby ใน pandas ผมใช้สำหรับจัดกลุ่มข้อมูลใน DataFrame แล้วคำนวณค่าสรุปในแต่ละกลุ่ม เช่น หาผลรวม ค่าเฉลี่ย หรือค่าสถิติต่างๆ ตามหมวดหมู่ที่กำหนด ถ้าใครเคยใช้ PivotTable ใน Excel มาก่อน บอกเลยว่าตัวนี้คือเครื่องมือสายเดียวกันเลยครับ

pandas pivot_table

pivot_table ใน pandas ผมใช้สำหรับสร้างตารางสรุปข้อมูลแบบ PivotTable เหมือนใน Excel เลยครับ — กำหนดได้ว่าจะเอาคอลัมน์ไหนเป็น rows, columns และจะรวมค่าด้วยฟังก์ชันอะไร ทั้งหมดจบในคำสั่งเดียว

Combine (1)
pandas concat

pd.concat ผมใช้สำหรับนำ DataFrame หลายตัวมาเชื่อมต่อกัน จะต่อแนวตั้ง (กองแถว) หรือแนวนอน (เพิ่มคอลัมน์) ก็ได้ ถ้าใครเคยใช้ Power Query ใน Excel แล้ว Append Queries คือตัวเทียบเคียงที่ใกล้เคียงที่สุดครับ

Comments

อีเมลของคุณจะไม่ถูกเผยแพร่