melt: จากรูปแบบกว้างเป็นรูปแบบยาว
แปลง DataFrame รูปแบบกว้างเป็นรูปแบบยาวด้วย pd.melt โดยระบุ id_vars และ value_vars
melt: จากรูปแบบกว้างเป็นรูปแบบยาว เป็นบทเรียน Pandas & NumPy Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Pandas & NumPy Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Pandas & NumPy Academy มีบทเรียนทั้งหมด 4 บทเรียน
รูปแบบข้อมูลกว้างเทียบกับรูปแบบยาว
ข้อมูลสามารถจัดโครงสร้างได้เป็นสองรูปแบบพื้นฐาน รูปแบบกว้าง มีหนึ่งแถวต่อหน่วยข้อมูล และกระจายค่าการวัดไปยังหลายคอลัมน์ เช่น แยกคอลัมน์ยอดขายของเดือนมกราคม กุมภาพันธ์ และมีนาคม ส่วน รูปแบบยาว มีหนึ่งแถวต่อการสังเกต โดยมีคอลัมน์หนึ่งสำหรับชื่อตัวแปรและอีกคอลัมน์สำหรับค่า ฟังก์ชันวิเคราะห์ส่วนใหญ่ของ Pandas ไลบรารีการเรียนรู้ของเครื่อง และเครื่องมือแสดงภาพข้อมูลมักต้องการรูปแบบยาว ทำให้ melt() เป็นเครื่องมือแปลงรูปแบบที่สำคัญ
ฟังก์ชัน pd.melt()
pd.melt(df) (มีให้ใช้ในรูปแบบ df.melt() เช่นกัน) จะแปลง DataFrame รูปแบบกว้างเป็นรูปแบบยาว พารามิเตอร์สำคัญ ได้แก่ id_vars (คอลัมน์ที่เก็บไว้เป็นตัวระบุโดยไม่เปลี่ยนแปลง), value_vars (คอลัมน์ที่ยกเลิกการจัดเป็นคอลัมน์แล้วแปลงเป็นแถว), var_name (ชื่อคอลัมน์ตัวแปรใหม่) และ value_name (ชื่อคอลัมน์ค่าใหม่)
import pandas as pd
# Wide format: separate columns per month
df_wide = pd.DataFrame({
'product': ['A', 'B'],
'Jan': [100, 150],
'Feb': [120, 130],
'Mar': [140, 160]
})
print(df_wide)
# product Jan Feb Mar
# 0 A 100 120 140
# 1 B 150 130 160การเรียกใช้ melt() พื้นฐาน
เรียกใช้ melt() โดยกำหนด id_vars เป็นคอลัมน์ที่ต้องการเก็บไว้เป็นตัวระบุ คอลัมน์อื่นทุกคอลัมน์จะถูกยกเลิกการจัดเป็นคอลัมน์: ชื่อคอลัมน์จะกลายเป็นค่าในคอลัมน์ตัวแปรใหม่ และค่าภายในเซลล์จะย้ายไปยังคอลัมน์ค่า จำนวนแถวของผลลัพธ์จะเท่ากับจำนวนแถวของข้อมูลเข้าคูณด้วยจำนวนคอลัมน์ค่าที่นำมาดำเนินการ melt
df_long = df_wide.melt(
id_vars='product',
var_name='month',
value_name='sales'
)
print(df_long)
# product month sales
# 0 A Jan 100
# 1 B Jan 150
# 2 A Feb 120
# 3 B Feb 130
# 4 A Mar 140
# 5 B Mar 160การเลือกคอลัมน์ที่จะนำมา melt
ตามค่าเริ่มต้น คอลัมน์ทุกคอลัมน์ที่ไม่ได้อยู่ใน id_vars จะถูกนำมาดำเนินการ melt ใช้ value_vars เพื่อดำเนินการกับเฉพาะ บางส่วน ของคอลัมน์ คอลัมน์ที่ไม่อยู่ใน id_vars หรือ value_vars จะถูกลบออกจากผลลัพธ์ วิธีนี้มีประโยชน์เมื่อ DataFrame รูปแบบกว้างมีทั้งคอลัมน์อนุกรมเวลาและคุณลักษณะอื่น ๆ ที่คุณไม่ต้องการยกเลิกการจัดเป็นคอลัมน์
df_wide2 = pd.DataFrame({
'product': ['A', 'B'],
'category': ['Electronics', 'Clothing'],
'Jan': [100, 150],
'Feb': [120, 130],
'Mar': [140, 160]
})
# Melt only Jan and Feb, keep product and category
df_long2 = df_wide2.melt(
id_vars=['product', 'category'],
value_vars=['Jan', 'Feb'],
var_name='month',
value_name='sales'
)
print(df_long2)การรีเซ็ตดัชนีหลัง melt()
melt() จะรักษาดัชนีแถวเดิมไว้ โดยทำซ้ำดัชนีสำหรับแต่ละตัวแปร ผลลัพธ์จึงมักมีดัชนีที่ไม่ต่อเนื่อง เช่น [0, 1, 0, 1, 0, 1] แนวทางที่ดีคือเรียก reset_index(drop=True) ทันทีหลัง melt() เพื่อให้ผลลัพธ์มีดัชนีต่อเนื่องที่สะอาด ตั้งแต่ 0 ถึง n-1
df_long = df_wide.melt(id_vars='product', var_name='month', value_name='sales')
print('Before reset:', df_long.index.tolist())
# [0, 1, 0, 1, 0, 1]
df_long = df_long.reset_index(drop=True)
print('After reset:', df_long.index.tolist())
# [0, 1, 2, 3, 4, 5]melt() คือการดำเนินการย้อนกลับของ pivot()
melt() เป็นการดำเนินการย้อนกลับของ pivot() / pivot_table() ในเชิงแนวคิด คุณสามารถแปลงจากรูปแบบยาวเป็นรูปแบบกว้างด้วย pivot_table() และแปลงจากรูปแบบกว้างกลับเป็นรูปแบบยาวด้วย melt() การแปลงไปกลับลักษณะนี้มักใช้ในกระบวนการทำงาน: รับข้อมูลรูปแบบกว้างมา ปรับเป็นรูปแบบยาวสำหรับการวาดกราฟด้วย Seaborn หรือสร้างคุณลักษณะสำหรับการเรียนรู้ของเครื่อง จากนั้นอาจปรับกลับเป็นรูปแบบกว้างสำหรับตารางรายงาน
# long -> wide
table = df_long.pivot_table(values='sales', index='product',
columns='month', aggfunc='sum')
print(table)
# product Feb Jan Mar
# A 120 100 140
# B 130 150 160
# wide -> long again
long_again = table.reset_index().melt(id_vars='product', var_name='month', value_name='sales')
print(long_again.head())การใช้ melt() สำหรับการวาดกราฟด้วย Seaborn
กราฟประเภทหมวดหมู่และกราฟความสัมพันธ์ของ Seaborn ทำงานได้ดีที่สุดกับข้อมูลรูปแบบยาว โดยทั่วไปจะเริ่มจาก DataFrame รูปแบบกว้างที่มีหนึ่งคอลัมน์ต่อกลุ่ม จากนั้นใช้ melt() เพื่อแปลงเป็นรูปแบบยาว ให้คอลัมน์หนึ่งใช้ระบุกลุ่มและอีกคอลัมน์เก็บค่า แล้วส่งทั้งสองคอลัมน์ไปยังพารามิเตอร์ hue และ x/y ของ Seaborn วิธีนี้เป็นหนึ่งในเหตุผลที่พบบ่อยที่สุดในการใช้ melt()
import seaborn as sns
import matplotlib.pyplot as plt
# Long format is required for sns.lineplot with hue
df_long = df_wide.melt(id_vars='product', var_name='month', value_name='sales')
# sns.lineplot(data=df_long, x='month', y='sales', hue='product')
# plt.show()
print('Long data ready for Seaborn:')
print(df_long)การตั้งชื่อคอลัมน์ผลลัพธ์
โดยค่าเริ่มต้น melt() จะตั้งชื่อคอลัมน์ตัวแปรใหม่ว่า 'variable' และคอลัมน์ค่าด้วยชื่อ 'value' ควรแทนที่ชื่อเหล่านี้ด้วยชื่อที่สื่อความหมายเสมอ โดยใช้ var_name และ value_name ชื่อคอลัมน์ที่บ่งบอกความหมายช่วยให้อ่านโค้ดในขั้นตอนถัดไปได้ง่ายขึ้น และป้องกันความสับสนเมื่อ DataFrame มีคอลัมน์หลายสิบคอลัมน์
# Default: generic column names 'variable' and 'value'
default = df_wide.melt(id_vars='product')
print(default.columns.tolist())
# ['product', 'variable', 'value']
# Better: descriptive names
good = df_wide.melt(id_vars='product', var_name='month', value_name='revenue_usd')
print(good.columns.tolist())
# ['product', 'month', 'revenue_usd']การแปลงข้อมูลแบบสำรวจ
กรณีใช้งานคลาสสิกของ melt() คือข้อมูลคำตอบแบบสำรวจ ซึ่งแต่ละคอลัมน์แทนคำถามหนึ่งข้อ และแต่ละแถวแทนผู้ตอบหนึ่งคน การแปลงนี้จะเปลี่ยนรูปแบบกว้างให้เป็นรูปแบบยาว โดยมีคอลัมน์สำหรับรหัสผู้ตอบ ชื่อคำถาม และค่าคำตอบ จากนั้นคุณจะคำนวณการกระจายของคำตอบสำหรับแต่ละคำถามได้อย่างง่ายดายโดยใช้ groupby()
survey = pd.DataFrame({
'respondent': [1, 2, 3],
'Q1_rating': [5, 3, 4],
'Q2_rating': [4, 5, 3],
'Q3_rating': [2, 4, 5]
})
long = survey.melt(id_vars='respondent', var_name='question', value_name='rating')
print(long)
print(long.groupby('question')['rating'].mean())การเรียงลำดับผลลัพธ์หลังการแปลง
หลังการแปลง แถวต่าง ๆ จะเรียงตามลำดับคอลัมน์เดิม (ม.ค., ก.พ., มี.ค. สำหรับแต่ละแถว) โดยบ่อยครั้งคุณอาจต้องการเรียงตามคอลัมน์ตัวระบุก่อน แล้วจึงเรียงตามคอลัมน์ตัวแปร ใช้ sort_values() กับ DataFrame ที่แปลงแล้ว เพื่อจัดลำดับให้เหมาะสมที่สุดกับการวิเคราะห์หรือการประมวลผลในขั้นตอนถัดไป
df_long = df_wide.melt(id_vars='product', var_name='month', value_name='sales')
# Sort by product, then month
df_sorted = df_long.sort_values(['product', 'month']).reset_index(drop=True)
print(df_sorted)
# product month sales
# 0 A Feb 120
# 1 A Jan 100
# 2 A Mar 140
# 3 B Feb 130
# 4 B Jan 150
# 5 B Mar 160melt() ในกระบวนการข้อมูล
ในกระบวนการข้อมูลทั่วไป melt() มักอยู่ถัดจากการโหลดหรือทำความสะอาดข้อมูลรูปแบบกว้าง และอยู่ก่อนขั้นตอนการวิเคราะห์หรือการสร้างแบบจำลอง ควรวางไว้ตั้งแต่ช่วงต้นของกระบวนการ เพื่อแปลงเป็นรูปแบบยาวได้อย่างรวดเร็ว จากนั้นการดำเนินการทั้งหมดในขั้นตอนถัดไป (groupby, Seaborn, sklearn) จะทำงานกับข้อมูลรูปแบบยาวที่สะอาดได้โดยไม่ต้องเขียนเงื่อนไขเฉพาะกรณี
def load_and_reshape(filepath):
raw = pd.read_csv(filepath)
# Melt all month columns into long format
month_cols = [c for c in raw.columns if c.startswith('month_')]
long = raw.melt(
id_vars=[c for c in raw.columns if c not in month_cols],
value_vars=month_cols,
var_name='month',
value_name='value'
)
return long.reset_index(drop=True)ตรวจสอบความเข้าใจ
ทดสอบความเข้าใจเกี่ยวกับการแปลงข้อมูลจากรูปแบบกว้างเป็นรูปแบบยาวด้วย pd.melt จากบทเรียนนี้
สรุปบทเรียน
ในบทเรียนนี้ คุณได้เรียนรู้ว่า melt() แปลง รูปแบบกว้างเป็นรูปแบบยาว โดยเปลี่ยนคอลัมน์ให้เป็นแถว id_vars ระบุคอลัมน์ที่คงไว้ และ value_vars เลือกคอลัมน์ที่ต้องการแปลง var_name และ value_name ใช้ตั้งชื่อที่สื่อความหมายให้คอลัมน์ใหม่ และรูปแบบยาวเหมาะสำหรับ Seaborn, groupby และกระบวนการเรียนรู้ของเครื่องมากกว่า ต่อไปเราจะสำรวจ stack และ unstack สำหรับปรับรูป DataFrames ที่มี MultiIndex
คำถามที่พบบ่อย
บทเรียน “melt: จากรูปแบบกว้างเป็นรูปแบบยาว” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “melt: จากรูปแบบกว้างเป็นรูปแบบยาว” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Pandas & NumPy Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Pandas & NumPy Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “melt: จากรูปแบบกว้างเป็นรูปแบบยาว”
แปลง DataFrame รูปแบบกว้างเป็นรูปแบบยาวด้วย pd.melt โดยระบุ id_vars และ value_vars คุณปฏิบัติ Pandas & NumPy Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Pandas & NumPy Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Pandas & NumPy Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน
บทเรียน “melt: จากรูปแบบกว้างเป็นรูปแบบยาว” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Pandas & NumPy Academy นี้ได้ไหม
ได้ บทเรียน Pandas & NumPy Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- pivot_table: ตารางไขว้
- melt: จากรูปแบบกว้างเป็นรูปแบบยาว
- stack และ unstack กับ MultiIndex
- crosstab สำหรับตารางความถี่