ข้ามไปยังเนื้อหาหลัก

pandas melt(): วิธีที่ดีที่สุดในการแปลงข้อมูลแบบกว้างเป็นแบบยาว

เรียนรู้การใช้ pandas.melt() เพื่อปรับโครงร่าง DataFrame จากรูปแบบกว้างเป็นแบบยาว พร้อมตัวอย่างใช้งานจริงและกรณีการใช้งานทั่วไป
อัปเดตแล้ว 4 ส.ค. 2569  · 8 นาที อ่าน

สำรวจด้วย AI

เปิดใน ChatGPTเปิดใน Claudeเปิดใน Perplexity

รูปแบบข้อมูลแบบกว้างอ่านง่าย แต่หลายงานวิเคราะห์และงานสร้างภาพข้อมูลทำงานได้ดีกว่าเมื่อข้อมูลอยู่ในรูปแบบแบบยาว

ฟังก์ชัน 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 จะเก็บดัชนีเดิมไว้

ลองดูตัวอย่างเพื่ออธิบายว่ารูปแบบข้างต้นปรับโครงร่างข้อมูลอย่างไร

สมมติว่ามีชุดข้อมูลด้านล่าง ซึ่งยอดขายรายเดือนของแต่ละผลิตภัณฑ์ถูกเก็บไว้ในคอลัมน์แยกกัน

ตัวอย่าง DataFrame ในรูปแบบกว้าง

สามารถใช้ 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 ที่ได้จะเก็บแต่ละเดือนเป็นแยกแถว

DataFrame ที่ถูกแปลงเป็นรูปแบบยาวด้วย pandas.melt()

ตัวอย่างที่พบบ่อยของ 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)

Melt เฉพาะคอลัมน์ที่เลือกด้วย pandas.melt()

คงคอลัมน์ตัวระบุ

ใช้พารามิเตอร์ 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()

คงคอลัมน์ตัวระบุด้วยฟังก์ชัน pandas.melt()

เปลี่ยนชื่อคอลัมน์ผลลัพธ์

หากสังเกตจะเห็นว่าคอลัมน์ผลลัพธ์มีชื่อเป็น 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()

เปลี่ยนชื่อคอลัมน์ผลลัพธ์ด้วย var_name และ value_name ในฟังก์ชัน pandas.melt()

คงดัชนีเดิม

โดยค่าเริ่มต้น 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)

การใช้ ignore_index=False เพื่อคงดัชนีเดิมในฟังก์ชัน pandas.melt()

จากตัวอย่างข้างต้น ป้ายกำกับแถวเดิม (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()

แปลงข้อมูลแบบกว้างให้เป็นแบบยาว

แปลงข้อมูลแบบยาวให้กลับเป็นแบบกว้าง 

แปลงคอลัมน์ให้เป็นแถว 

แปลงค่าในแถวให้เป็นคอลัมน์

มีประโยชน์สำหรับเตรียมข้อมูลเพื่อวิเคราะห์และสร้างภาพ

มีประโยชน์สำหรับสรุปหรือจัดแสดงข้อมูลในรายงาน

ดังนั้น เลือก melt() เมื่อการวัดผลกระจายอยู่หลายคอลัมน์ หรือเลือก pivot() เมื่ออยากกระจายค่าจากแถวไปเป็นคอลัมน์

pandas.melt() เทียบกับ stack()

แม้ทั้งสองฟังก์ชันจะปรับโครงร่างข้อมูล แต่มีความแตกต่างดังนี้

melt()

stack()

ปรับคอลัมน์ปกติให้เป็นแถว

ย้ายระดับของคอลัมน์หนึ่งระดับหรือมากกว่าไปไว้ในดัชนี 

ให้ผลเป็น DataFrame มาตรฐาน 

ให้ผลเป็น Series หรือ DataFrame ที่มี MultiIndex 

อ่านง่ายและใช้กับงานวิเคราะห์ส่วนใหญ่ได้สะดวก

เหมาะกับการปรับโครงร่างที่อิงดัชนี

สามารถใช้ stack() เมื่อจำเป็นต้องทำงานกับดัชนีลำดับชั้นหรือวัตถุ MultiIndex

pandas.melt() เทียบกับ wide_to_long()

ทั้งสองฟังก์ชันแปลงข้อมูลแบบกว้างเป็นแบบยาว แต่ออกแบบมาสำหรับสถานการณ์ที่ต่างกันดังด้านล่าง

melt()

wide_to_long()

ยืดหยุ่นและใช้ได้กับเกือบทุก DataFrame

ออกแบบมาสำหรับชุดข้อมูลที่มีรูปแบบการตั้งชื่อคอลัมน์ที่สม่ำเสมอ  

เหมาะกับการปรับโครงร่างทั่วไป  

เหมาะสำหรับการวัดที่ซ้ำเช่น Sales_2023, Sales_2024 และ Sales_2025

หากชุดข้อมูลของคุณมีชื่อคอลัมน์ไม่เป็นระเบียบ ให้ใช้ melt() หากคอลัมน์มีรูปแบบการตั้งชื่อที่คาดเดาได้ ให้ใช้ wide_to_long() เพื่อปรับโครงร่างข้อมูลด้วยโค้ดที่น้อยกว่า

ข้อผิดพลาดที่พบบ่อยกับ pandas.melt()

แม้ pandas.melt() จะใช้งานตรงไปตรงมา แต่นี่คือข้อผิดพลาดที่พบบ่อยและวิธีแก้ไข

  • ลืมกำหนด id_vars: หากไม่ระบุ id_vars pandas จะถือว่าทุกคอลัมน์ที่ไม่อยู่ใน 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)

หัวข้อ

เรียนรู้ pandas กับ DataCamp

Courses

การนำเข้าข้อมูลด้วย pandas อย่างมีประสิทธิภาพ

4 ชม.
63.3K
เรียนรู้การดึงข้อมูลจากรูปแบบไฟล์และระบบที่ใช้กันทั่วไป เช่น ไฟล์ CSV, สเปรดชีต, JSON, ฐานข้อมูล SQL และ API
ดูรายละเอียดRight Arrow
เริ่มหลักสูตร
ดูเพิ่มเติมRight Arrow