0Pricing
Pandas & NumPy Academy · บทเรียน

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    160

melt() ในกระบวนการข้อมูล

ในกระบวนการข้อมูลทั่วไป 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. pivot_table: ตารางไขว้
  2. melt: จากรูปแบบกว้างเป็นรูปแบบยาว
  3. stack และ unstack กับ MultiIndex
  4. crosstab สำหรับตารางความถี่
← กลับไปที่ Pandas & NumPy Academy