Courses
รูปแบบข้อมูลแบบกว้างอ่านง่าย แต่หลายงานวิเคราะห์และงานสร้างภาพข้อมูลทำงานได้ดีกว่าเมื่อข้อมูลอยู่ในรูปแบบแบบยาว
ฟังก์ชัน pandas.melt() จะปรับโครงร่าง DataFrame โดยแปลงหนึ่งคอลัมน์หรือมากกว่าให้กลายเป็นแถว โดยยังคงคอลัมน์ตัวระบุที่เลือกไว้ไม่เปลี่ยนแปลง วิธีนี้ทำให้ข้อมูลกรอง จัดกลุ่ม สร้างภาพ และวิเคราะห์ได้ง่ายขึ้น
ในบทเรียนนี้ ฉจะแสดงวิธีใช้ฟังก์ชัน pandas.melt() และจะแสดงให้เห็นด้วยว่ามันเปรียบเทียบกับตัวเลือกอย่าง pivot(), stack() และ wide_to_long() อย่างไร หากเพิ่งเริ่มต้นกับ Python ขอแนะนำคอร์ส Introduction to Python ของเรา ซึ่งครอบคลุมทักษะอย่างชนิดข้อมูล รายการ ฟังก์ชันพื้นฐาน และแพ็กเกจ
วิธีใช้ pandas.melt()
ฟังก์ชัน pandas.melt() แปลง DataFrame จากรูปแบบกว้างเป็นรูปแบบยาว โดยเปลี่ยนส่วนหัวคอลัมน์ให้เป็นค่าในคอลัมน์ใหม่
ไวยากรณ์มีดังนี้:
pandas.melt(
frame,
id_vars=None,
value_vars=None,
var_name=None,
value_name="value",
col_level=None,
ignore_index=True
)
โดยที่:
-
frame: DataFrame ที่ต้องการปรับโครงร่าง กำหนดเฉพาะเมื่อใช้pandas.melt(). -
id_vars: คอลัมน์หรือรายการคอลัมน์ที่ต้องการคงไว้ไม่เปลี่ยนแปลง คอลัมน์เหล่านี้ใช้ระบุตัวตนของแต่ละแถวหลังการปรับโครงร่าง -
value_vars: คอลัมน์หรือรายการคอลัมน์ที่ต้องการ unpivot หากละไว้ pandas จะ melt ทุกคอลัมน์ที่ไม่ได้อยู่ในid_vars. -
var_name: ชื่อคอลัมน์ใหม่ที่เก็บชื่อคอลัมน์เดิม ค่าเริ่มต้นคือ"variable"หากไม่ระบุ -
value_name: ชื่อคอลัมน์ใหม่ที่เก็บค่า ค่าเริ่มต้นคือ"value"หากไม่ระบุ -
col_level: ตัวเลือก ใช้ระบุระดับของคอลัมน์ที่จะ melt เมื่อใช้คอลัมน์แบบ MultiIndex -
ignore_index: หากเป็นTrue(ค่าเริ่มต้น) จะสร้างดัชนีลำดับใหม่ หากเป็นFalseจะเก็บดัชนีเดิมไว้
ลองดูตัวอย่างเพื่ออธิบายว่ารูปแบบข้างต้นปรับโครงร่างข้อมูลอย่างไร
สมมติว่ามีชุดข้อมูลด้านล่าง ซึ่งยอดขายรายเดือนของแต่ละผลิตภัณฑ์ถูกเก็บไว้ในคอลัมน์แยกกัน

สามารถใช้ pandas.melt() เพื่อแปลงคอลัมน์เดือนให้เป็นแถวได้
# Convert the DataFrame from wide format to long format
products_sales_2025_melted = products_sales_2025.melt(
# Keep the Product and Category columns unchanged
id_vars=["Product", "Category"],
# Convert the month columns into rows
value_vars=["January", "February", "March", "April", "May", "June"],
# Name of the new column that stores the original column names
var_name="Month",
# Name of the new column that stores the corresponding sales values
value_name="Sales"
)
# Display the reshaped DataFrame
products_sales_2025_melted.head(10)
DataFrame ที่ได้จะเก็บแต่ละเดือนเป็นแยกแถว

ตัวอย่างที่พบบ่อยของ pandas.melt()
ตอนนี้เข้าใจแล้วว่าไวยากรณ์ของ pandas.melt() ทำงานอย่างไร มาดูพฤติกรรมของพารามิเตอร์แต่ละตัวกัน โดยจะใช้ตารางด้านบนในตัวอย่างต่อไปนี้
Melt เฉพาะคอลัมน์ที่เลือก
พารามิเตอร์ value_vars ให้กำหนดได้ว่าจะ unpivot คอลัมน์ใดบ้าง แทนที่จะ melt ทุกเดือน สามารถแปลงเฉพาะคอลัมน์ที่ต้องการได้
ในตัวอย่างนี้ melt เฉพาะคอลัมน์ January และ February ส่วนคอลัมน์เดือนที่เหลือถูกละไว้
# Convert only the January and February columns into rows
product_sales_3month = products_sales_2025.melt(
id_vars="Product",
value_vars=["January", "February",]
)
product_sales_3month.head(20)

คงคอลัมน์ตัวระบุ
ใช้พารามิเตอร์ id_vars เพื่อคงหนึ่งคอลัมน์หรือมากกว่าไว้ไม่เปลี่ยนแปลง ขณะที่คอลัมน์ที่เหลือถูกปรับโครงร่าง
ในตัวอย่างด้านล่าง “Product” และ “Category” ยังคงเดิม ในขณะที่คอลัมน์ยอดขายรายเดือนถูกแปลงเป็นแถว
# Keep the Product and Category columns while melting the monthly sales
product_sales_cat = products_sales_2025.melt(
id_vars=["Product", "Category"]
)
product_sales_cat.head()

เปลี่ยนชื่อคอลัมน์ผลลัพธ์
หากสังเกตจะเห็นว่าคอลัมน์ผลลัพธ์มีชื่อเป็น variable และ value โดยค่าเริ่มต้น ใช้อาร์กิวเมนต์ var_name และ value_name เพื่อให้ชื่อที่อธิบายความหมายได้ชัดเจน
เช่น ในผลลัพธ์ด้านล่างได้เปลี่ยนชื่อคอลัมน์ตัวแปรเป็น “Month” และค่าคือ “Sales”
# Keep the Product and Category columns while melting the monthly sales
# Rename Month and Sales columns
product_sales_cat = products_sales_2025.melt(
id_vars=["Product", "Category"],
var_name="Month",
value_name="Sales"
)
product_sales_cat.head()

คงดัชนีเดิม
โดยค่าเริ่มต้น pandas.melt() จะสร้างดัชนีลำดับใหม่ กำหนด ignore_index=False เพื่อคงดัชนีแถวเดิมไว้
# Keep the original row index after reshaping
product_sales_index = products_sales_2025.melt(
id_vars=["Product", "Category"],
var_name="Month",
value_name="Sales",
ignore_index=False
)
product_sales_index.head(10)

จากตัวอย่างข้างต้น ป้ายกำกับแถวเดิม (0–5) จะถูกทำซ้ำสำหรับแต่ละเดือน แทนที่จะถูกแทนที่ด้วยดัชนีลำดับใหม่
ควรใช้ pandas.melt() เมื่อใด?
pandas.melt() มีประโยชน์เมื่อข้อมูลอยู่ในรูปแบบกว้างและต้องแปลงเป็นรูปแบบยาวเพื่อการวิเคราะห์หรือการสร้างภาพข้อมูล นอกจากนี้ยังมีความสำคัญในกรณีใช้งานต่อไปนี้:
-
แปลงข้อมูลแบบกว้างเป็นแบบยาว: หลายชุดข้อมูลเก็บค่าที่เกี่ยวข้องไว้ในหลายคอลัมน์ แม้รูปแบบนี้จะอ่านง่าย แต่ทำให้การวิเคราะห์ยากขึ้น
pandas.melt()รวมคอลัมน์เหล่านั้นให้เป็นคอลัมน์เดียว โดยคงคอลัมน์ตัวระบุไว้ สร้างโครงสร้างที่สะอาดขึ้นสำหรับการประมวลผลต่อ -
เตรียมข้อมูลสำหรับการทำกราฟ: ไลบรารีสร้างกราฟหลายตัว เช่น Seaborn ทำงานได้ดีที่สุดกับข้อมูลแบบยาวเมื่อสร้างกราฟ แทนที่จะรวมหลายคอลัมน์ด้วยตนเอง สามารถใช้
pandas.melt()เพื่อปรับโครงร่างข้อมูลให้เป็นรูปแบบที่ไลบรารีเหล่านี้คาดหวัง -
เตรียมข้อมูลสำหรับการวิเคราะห์เชิงสถิติ: การดำเนินการหลายอย่างของ pandas รวมถึง
groupby()การรวมค่า การกรอง และสถิติสรุป ทำงานง่ายขึ้นเมื่อเก็บการวัดอยู่ในคอลัมน์เดียวแทนที่จะกระจายอยู่หลายคอลัมน์ หากปรับโครงร่างข้อมูลด้วยpandas.melt()จะช่วยลดจำนวนโค้ดที่ต้องใช้ในการวิเคราะห์ตัวแปรต่างๆ -
สร้างชุดข้อมูลแบบ tidy: ชุดข้อมูลแบบ tidy จะเก็บแต่ละตัวแปรในคอลัมน์ของตนเอง และแต่ละการสังเกตในแถวของตนเอง หากชุดข้อมูลมีการวัดที่ซ้ำกันกระจายอยู่หลายคอลัมน์
pandas.melt()มักเป็นวิธีที่เร็วที่สุดในการแปลงให้เป็นรูปแบบ tidy
ขอแนะนำคอร์ส Introduction to Data Visualization with Seaborn เพื่อเรียนรู้การสร้างและปรับแต่งกราฟหลากหลายประเภทใน Python เช่น scatter, count, bar และ box plot
pandas.melt() เทียบกับฟังก์ชันปรับโครงร่างอื่น
Pandas มีฟังก์ชันหลายตัวสำหรับปรับโครงร่างข้อมูล โดยแต่ละตัวมีวัตถุประสงค์ต่างกัน มาดูความแตกต่างของแต่ละวิธีกัน
pandas.melt() เทียบกับ pivot()
ตารางด้านล่างแสดงความแตกต่างระหว่างฟังก์ชัน pandas.melt() และ pivot()
|
|
|
|
แปลงข้อมูลแบบกว้างให้เป็นแบบยาว |
แปลงข้อมูลแบบยาวให้กลับเป็นแบบกว้าง |
|
แปลงคอลัมน์ให้เป็นแถว |
แปลงค่าในแถวให้เป็นคอลัมน์ |
|
มีประโยชน์สำหรับเตรียมข้อมูลเพื่อวิเคราะห์และสร้างภาพ |
มีประโยชน์สำหรับสรุปหรือจัดแสดงข้อมูลในรายงาน |
ดังนั้น เลือก melt() เมื่อการวัดผลกระจายอยู่หลายคอลัมน์ หรือเลือก pivot() เมื่ออยากกระจายค่าจากแถวไปเป็นคอลัมน์
pandas.melt() เทียบกับ stack()
แม้ทั้งสองฟังก์ชันจะปรับโครงร่างข้อมูล แต่มีความแตกต่างดังนี้
|
|
|
|
ปรับคอลัมน์ปกติให้เป็นแถว |
ย้ายระดับของคอลัมน์หนึ่งระดับหรือมากกว่าไปไว้ในดัชนี |
|
ให้ผลเป็น DataFrame มาตรฐาน |
ให้ผลเป็น Series หรือ DataFrame ที่มี MultiIndex |
|
อ่านง่ายและใช้กับงานวิเคราะห์ส่วนใหญ่ได้สะดวก |
เหมาะกับการปรับโครงร่างที่อิงดัชนี |
สามารถใช้ stack() เมื่อจำเป็นต้องทำงานกับดัชนีลำดับชั้นหรือวัตถุ MultiIndex
pandas.melt() เทียบกับ wide_to_long()
ทั้งสองฟังก์ชันแปลงข้อมูลแบบกว้างเป็นแบบยาว แต่ออกแบบมาสำหรับสถานการณ์ที่ต่างกันดังด้านล่าง
|
|
|
|
ยืดหยุ่นและใช้ได้กับเกือบทุก DataFrame |
ออกแบบมาสำหรับชุดข้อมูลที่มีรูปแบบการตั้งชื่อคอลัมน์ที่สม่ำเสมอ |
|
เหมาะกับการปรับโครงร่างทั่วไป |
เหมาะสำหรับการวัดที่ซ้ำเช่น Sales_2023, Sales_2024 และ Sales_2025 |
หากชุดข้อมูลของคุณมีชื่อคอลัมน์ไม่เป็นระเบียบ ให้ใช้ melt() หากคอลัมน์มีรูปแบบการตั้งชื่อที่คาดเดาได้ ให้ใช้ wide_to_long() เพื่อปรับโครงร่างข้อมูลด้วยโค้ดที่น้อยกว่า
ข้อผิดพลาดที่พบบ่อยกับ pandas.melt()
แม้ pandas.melt() จะใช้งานตรงไปตรงมา แต่นี่คือข้อผิดพลาดที่พบบ่อยและวิธีแก้ไข
-
ลืมกำหนด id_vars: หากไม่ระบุ
id_varspandas จะถือว่าทุกคอลัมน์ที่ไม่อยู่ในvalue_varsเป็นคอลัมน์ค่า ซึ่งอาจทำให้คอลัมน์ที่ตั้งใจจะคงเป็นตัวระบุถูกปรับโครงร่างไปด้วย แก้ไขโดยระบุคอลัมน์ที่อธิบายเรคคอร์ดแต่ละรายการอย่างเอกลักษณ์ และส่งให้กับid_vars -
ละลายคอลัมน์ที่ไม่ตั้งใจ: หากละ
value_varsไว้ pandas จะ melt ทุกคอลัมน์ที่ไม่รวมในid_varsซึ่งอาจรวมถึงคอลัมน์ที่ไม่ตั้งใจจะปรับโครงร่าง ดังนั้น ระบุvalue_varsเสมอเมื่ออยาก melt เฉพาะบางคอลัมน์ -
เข้าใจรูปร่างผลลัพธ์ผิด: หลัง melt จำนวนแถวจะเพิ่มขึ้น เพราะแต่ละคอลัมน์ที่เลือกจะกลายเป็นแยกแถวสำหรับทุกรายการ ตัวอย่างเช่น DataFrame ที่มี 10 แถวและคอลัมน์เดือน 12 คอลัมน์ จะได้ 120 แถวหลังจาก melt คอลัมน์เดือน ดังนั้น ตรวจสอบ shape ก่อนและหลังปรับโครงร่างเสมอเพื่อยืนยันว่าข้อมูลถูก melt อย่างถูกต้อง
-
สับสนระหว่างรูปแบบกว้างและยาว: จำไว้เสมอว่ารูปแบบกว้างจะเก็บค่าที่คล้ายกันกระจายอยู่หลายคอลัมน์ ส่วนรูปแบบยาวจะเก็บค่าที่คล้ายกันไว้ในคอลัมน์เดียว และมีอีกคอลัมน์หนึ่งใช้ระบุตัวแปร
แนวปฏิบัติที่ดีที่สุดในการใช้ pandas.melt()
เพื่อให้โค้ดปรับโครงร่างของคุณเข้าใจและดูแลรักษาได้ง่าย ขอแนะนำให้ปฏิบัติดังนี้เมื่อใช้ฟังก์ชัน pandas.melt():
-
ระบุคอลัมน์ตัวระบุก่อน: ตัดสินใจว่าคอลัมน์ใดควรคงเดิม แล้วส่งให้กับ
id_vars -
เปลี่ยนชื่อคอลัมน์ที่สร้างขึ้น: ใช้
var_nameและvalue_nameแทนที่จะพึ่งชื่อค่าเริ่มต้นอย่าง variable และ value -
ตรวจสอบจำนวนแถวหลัง melt: ยืนยันว่าจำนวนแถวเป็นไปตามที่คาดหวัง โดยเฉพาะเมื่อ melt หลายคอลัมน์
-
ใช้ pivot() เพื่อปรับกลับเป็นแบบเดิม: หากต้องการคืนรูปแบบกว้างหลังการวิเคราะห์ ให้ใช้ฟังก์ชัน
pivot()
ลงคอร์ส Writing Efficient Python Code เพื่อเรียนรู้การเขียนโค้ดที่มีประสิทธิภาพและดีต่อการดีบักและดูแลรักษา
สรุป
pandas.melt() เป็นฟังก์ชันมาตรฐานของ pandas สำหรับแปลงข้อมูลแบบกว้างให้เป็นแบบยาว และเมื่อเข้าใจบทบาทของ id_vars และ value_vars ก็จะควบคุมได้ว่าคอลัมน์ใดคงเป็นตัวระบุ และคอลัมน์ใดถูกแปลงเป็นแถว
หากต้องการความเข้าใจเชิงลึกเกี่ยวกับ Python สามารถเรียนรู้เพิ่มเติมจากเส้นทางทักษะ Python Data Fundamentals และ Python Programming Fundamentals ของเรา
คำถามที่พบบ่อย (FAQs)
ควรใช้ pandas.melt() เมื่อใด?
ใช้เมื่อข้อมูลมีค่าที่ซ้ำกันกระจายอยู่ตามคอลัมน์ และต้องการ DataFrame รูปแบบยาวเพื่อการวิเคราะห์หรือการสร้างภาพข้อมูล
var_name และ value_name คืออะไร?
พารามิเตอร์เหล่านี้ใช้เปลี่ยนชื่อคอลัมน์ที่สร้างขึ้นซึ่งเก็บชื่อคอลัมน์เดิมและค่าที่สอดคล้องกัน
pandas.melt() แก้ไข DataFrame เดิมหรือไม่?
ไม่ ฟังก์ชันนี้ส่งคืน DataFrame ใหม่ที่ถูกปรับโครงร่าง และเว้นอันเดิมไว้ไม่เปลี่ยนแปลง
ความแตกต่างระหว่าง melt() และ pivot() คืออะไร?
melt() แปลงข้อมูลแบบกว้างเป็นรูปแบบยาว ในขณะที่ pivot() แปลงข้อมูลแบบยาวกลับเป็นรูปแบบกว้าง
ความแตกต่างระหว่าง melt() และ stack() คืออะไร?
melt() ปรับคอลัมน์ให้เป็นแถวพร้อมคง DataFrame แบบปกติ ส่วน stack() ย้ายคอลัมน์ไปยังดัชนีและสร้างโครงสร้างหลายระดับ (MultiIndex)