รูปแบบข้อมูลแบบกว้างอ่านง่าย แต่หลายงานวิเคราะห์และงานสร้างภาพข้อมูลทำงานได้ดีกว่าเมื่อข้อมูลอยู่ในรูปแบบแบบยาว
ฟังก์ชัน 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() เพื่อแปลงคอลัมน์เดือนให้เป็นแถวได้
products_sales_2025_melted = products_sales_2025. melt(
id_vars= [ "Product" , "Category" ] ,
value_vars= [ "January" , "February" , "March" , "April" , "May" , "June" ] ,
var_name= "Month" ,
value_name= "Sales"
)
products_sales_2025_melted. head( 10 ) ขับเคลื่อนโดย
DataFrame ที่ได้จะเก็บแต่ละเดือนเป็นแยกแถว
ตัวอย่างที่พบบ่อยของ pandas.melt()
ตอนนี้เข้าใจแล้วว่าไวยากรณ์ของ pandas.melt() ทำงานอย่างไร มาดูพฤติกรรมของพารามิเตอร์แต่ละตัวกัน โดยจะใช้ตารางด้านบนในตัวอย่างต่อไปนี้
Melt เฉพาะคอลัมน์ที่เลือก
พารามิเตอร์ value_vars ให้กำหนดได้ว่าจะ unpivot คอลัมน์ใดบ้าง แทนที่จะ melt ทุกเดือน สามารถแปลงเฉพาะคอลัมน์ที่ต้องการได้
ในตัวอย่างนี้ melt เฉพาะคอลัมน์ January และ February ส่วนคอลัมน์เดือนที่เหลือถูกละไว้
product_sales_3month = products_sales_2025. melt(
id_vars= "Product" ,
value_vars= [ "January" , "February" , ]
)
product_sales_3month. head( 20 ) ขับเคลื่อนโดย
คงคอลัมน์ตัวระบุ
ใช้พารามิเตอร์ id_vars เพื่อคงหนึ่งคอลัมน์หรือมากกว่าไว้ไม่เปลี่ยนแปลง ขณะที่คอลัมน์ที่เหลือถูกปรับโครงร่าง
ในตัวอย่างด้านล่าง “Product” และ “Category” ยังคงเดิม ในขณะที่คอลัมน์ยอดขายรายเดือนถูกแปลงเป็นแถว
product_sales_cat = products_sales_2025. melt(
id_vars= [ "Product" , "Category" ]
)
product_sales_cat. head( ) ขับเคลื่อนโดย
เปลี่ยนชื่อคอลัมน์ผลลัพธ์
หากสังเกตจะเห็นว่าคอลัมน์ผลลัพธ์มีชื่อเป็น variable และ value โดยค่าเริ่มต้น ใช้อาร์กิวเมนต์ var_name และ value_name เพื่อให้ชื่อที่อธิบายความหมายได้ชัดเจน
เช่น ในผลลัพธ์ด้านล่างได้เปลี่ยนชื่อคอลัมน์ตัวแปรเป็น “Month” และค่าคือ “Sales”
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 เพื่อคงดัชนีแถวเดิมไว้
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()
แปลงข้อมูลแบบกว้างให้เป็นแบบยาว
แปลงข้อมูลแบบยาวให้กลับเป็นแบบกว้าง
แปลงคอลัมน์ให้เป็นแถว
แปลงค่าในแถวให้เป็นคอลัมน์
มีประโยชน์สำหรับเตรียมข้อมูลเพื่อวิเคราะห์และสร้างภาพ
มีประโยชน์สำหรับสรุปหรือจัดแสดงข้อมูลในรายงาน
ดังนั้น เลือก 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 ของเรา
รูปแบบข้อมูลแบบกว้างอ่านง่าย แต่หลายงานวิเคราะห์และงานสร้างภาพข้อมูลทำงานได้ดีกว่าเมื่อข้อมูลอยู่ในรูปแบบแบบยาว
ฟังก์ชัน
pandas.melt()จะปรับโครงร่าง DataFrame โดยแปลงหนึ่งคอลัมน์หรือมากกว่าให้กลายเป็นแถว โดยยังคงคอลัมน์ตัวระบุที่เลือกไว้ไม่เปลี่ยนแปลง วิธีนี้ทำให้ข้อมูลกรอง จัดกลุ่ม สร้างภาพ และวิเคราะห์ได้ง่ายขึ้นในบทเรียนนี้ ฉจะแสดงวิธีใช้ฟังก์ชัน
pandas.melt()และจะแสดงให้เห็นด้วยว่ามันเปรียบเทียบกับตัวเลือกอย่างpivot(),stack()และwide_to_long()อย่างไร หากเพิ่งเริ่มต้นกับ Python ขอแนะนำคอร์ส Introduction to Python ของเรา ซึ่งครอบคลุมทักษะอย่างชนิดข้อมูล รายการ ฟังก์ชันพื้นฐาน และแพ็กเกจวิธีใช้ pandas.melt()
ฟังก์ชัน
pandas.melt()แปลง DataFrame จากรูปแบบกว้างเป็นรูปแบบยาว โดยเปลี่ยนส่วนหัวคอลัมน์ให้เป็นค่าในคอลัมน์ใหม่ไวยากรณ์มีดังนี้:
โดยที่:
frame: DataFrame ที่ต้องการปรับโครงร่าง กำหนดเฉพาะเมื่อใช้pandas.melt().id_vars: คอลัมน์หรือรายการคอลัมน์ที่ต้องการคงไว้ไม่เปลี่ยนแปลง คอลัมน์เหล่านี้ใช้ระบุตัวตนของแต่ละแถวหลังการปรับโครงร่างvalue_vars: คอลัมน์หรือรายการคอลัมน์ที่ต้องการ unpivot หากละไว้ pandas จะ melt ทุกคอลัมน์ที่ไม่ได้อยู่ในid_vars.var_name: ชื่อคอลัมน์ใหม่ที่เก็บชื่อคอลัมน์เดิม ค่าเริ่มต้นคือ"variable"หากไม่ระบุvalue_name: ชื่อคอลัมน์ใหม่ที่เก็บค่า ค่าเริ่มต้นคือ"value"หากไม่ระบุcol_level: ตัวเลือก ใช้ระบุระดับของคอลัมน์ที่จะ melt เมื่อใช้คอลัมน์แบบ MultiIndexignore_index: หากเป็นTrue(ค่าเริ่มต้น) จะสร้างดัชนีลำดับใหม่ หากเป็นFalseจะเก็บดัชนีเดิมไว้ลองดูตัวอย่างเพื่ออธิบายว่ารูปแบบข้างต้นปรับโครงร่างข้อมูลอย่างไร
สมมติว่ามีชุดข้อมูลด้านล่าง ซึ่งยอดขายรายเดือนของแต่ละผลิตภัณฑ์ถูกเก็บไว้ในคอลัมน์แยกกัน
สามารถใช้
pandas.melt()เพื่อแปลงคอลัมน์เดือนให้เป็นแถวได้DataFrame ที่ได้จะเก็บแต่ละเดือนเป็นแยกแถว
ตัวอย่างที่พบบ่อยของ pandas.melt()
ตอนนี้เข้าใจแล้วว่าไวยากรณ์ของ
pandas.melt()ทำงานอย่างไร มาดูพฤติกรรมของพารามิเตอร์แต่ละตัวกัน โดยจะใช้ตารางด้านบนในตัวอย่างต่อไปนี้Melt เฉพาะคอลัมน์ที่เลือก
พารามิเตอร์
value_varsให้กำหนดได้ว่าจะ unpivot คอลัมน์ใดบ้าง แทนที่จะ melt ทุกเดือน สามารถแปลงเฉพาะคอลัมน์ที่ต้องการได้ในตัวอย่างนี้ melt เฉพาะคอลัมน์ January และ February ส่วนคอลัมน์เดือนที่เหลือถูกละไว้
คงคอลัมน์ตัวระบุ
ใช้พารามิเตอร์
id_varsเพื่อคงหนึ่งคอลัมน์หรือมากกว่าไว้ไม่เปลี่ยนแปลง ขณะที่คอลัมน์ที่เหลือถูกปรับโครงร่างในตัวอย่างด้านล่าง “Product” และ “Category” ยังคงเดิม ในขณะที่คอลัมน์ยอดขายรายเดือนถูกแปลงเป็นแถว
เปลี่ยนชื่อคอลัมน์ผลลัพธ์
หากสังเกตจะเห็นว่าคอลัมน์ผลลัพธ์มีชื่อเป็น
variableและvalueโดยค่าเริ่มต้น ใช้อาร์กิวเมนต์var_nameและvalue_nameเพื่อให้ชื่อที่อธิบายความหมายได้ชัดเจนเช่น ในผลลัพธ์ด้านล่างได้เปลี่ยนชื่อคอลัมน์ตัวแปรเป็น “Month” และค่าคือ “Sales”
คงดัชนีเดิม
โดยค่าเริ่มต้น
pandas.melt()จะสร้างดัชนีลำดับใหม่ กำหนดignore_index=Falseเพื่อคงดัชนีแถวเดิมไว้จากตัวอย่างข้างต้น ป้ายกำกับแถวเดิม (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()เมื่อจำเป็นต้องทำงานกับดัชนีลำดับชั้นหรือวัตถุ MultiIndexpandas.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_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 ของเรา