Skip to main content

Data Transform

Data Transform คืออะไร

Data Transformation คือ กระบวนการแปลงหรือปรับข้อมูลให้เหมาะสมสำหรับการวิเคราะห์เพิ่มเติมหรือการใช้งานอื่น ๆ โดยในหลายกรณี Data Transformation จะเกี่ยวข้องกับการรวมข้อมูลจากหลายแหล่งเข้าด้วยกันเพื่อให้ได้ภาพรวมของข้อมูลทั้งหมด ซึ่งอาจรวมถึงกระบวนการต่อไปนี้

  1. Merging – การรวมข้อมูลจากสองหรือหลาย DataFrame เข้าด้วยกันบนฐานของคีย์ที่เกี่ยวข้อง เช่น การรวมข้อมูลของลูกค้าและรายการขาย โดยอิงจากรหัสลูกค้าหรือข้อมูลระบุตัวตนที่คล้ายกัน
  2. Joining – คล้ายกับ Merging แต่การ Join มักจะระบุประเภทของการรวมมากขึ้น เช่น Inner Join, Left Join, Right Join ซึ่งจะกำหนดลักษณะการรวมว่าข้อมูลจาก DataFrame ใดที่ควรจะปรากฏหรือจะถูกกรองออก
  3. Concatenating – การวางข้อมูลต่อกันในรูปแบบที่เรียงลำดับตามแนวนอนหรือแนวตั้ง เช่น การนำข้อมูลยอดขายของแต่ละปีมาต่อกันเพื่อให้ได้ยอดขายที่ครอบคลุมหลายปีใน DataFrame เดียว
  4. Pivot – การจัดเรียงข้อมูลในรูปแบบใหม่โดยใช้ค่าเฉพาะเป็นการอ้างอิง เช่น เปลี่ยนข้อมูลในลักษณะรายการให้เป็นตาราง โดยหมุนหรือย้ายข้อมูลที่มีอยู่เพื่อให้ดูง่ายขึ้นหรือเพื่อใช้ในการวิเคราะห์เพิ่มเติม

การใช้ Data Transformation จะช่วยให้การทำงานกับข้อมูลที่หลากหลายเป็นไปอย่างมีประสิทธิภาพ ทำให้สามารถจัดการข้อมูลได้สะดวกและเตรียมพร้อมสำหรับการวิเคราะห์เชิงลึก

Merging

Merging คือกระบวนการรวมข้อมูลจากสอง DataFrame หรือมากกว่าที่มีข้อมูลที่เกี่ยวข้องกัน โดยอ้างอิงจากคีย์หรือคอลัมน์ที่มีค่าเดียวกัน เช่น รหัสลูกค้า หรือชื่อพนักงานที่ปรากฏใน DataFrame ทั้งสอง การ Merging จะช่วยในการรวบรวมข้อมูลที่อยู่ในแหล่งข้อมูลต่าง ๆ เข้าด้วยกันเพื่อให้สามารถวิเคราะห์ได้ง่ายขึ้น

ใน Python, การใช้ merge ของ pandas จะทำให้การรวม DataFrame เป็นเรื่องง่าย ตัวอย่างของการใช้งานมีดังนี้

import pandas as pd

# ตัวอย่าง DataFrame แรก
df1 = pd.DataFrame({
'customer_id': [1, 2, 3, 4],
'name': ['Alice', 'Bob', 'Charlie', 'David'],
'purchase': [100, 150, 200, 250]
})

# ตัวอย่าง DataFrame ที่สอง
df2 = pd.DataFrame({
'customer_id': [1, 2, 3, 5],
'location': ['Bangkok', 'Chiang Mai', 'Phuket', 'Pattaya'],
'membership_level': ['Gold', 'Silver', 'Gold', 'Bronze']
})

# การ Merging DataFrame ทั้งสองโดยใช้คอลัมน์ 'customer_id' เป็นคีย์
merged_df = pd.merge(df1, df2, on='customer_id', how='inner')

print("Merged DataFrame:")
print(merged_df)

จาก code

  • df1 มีข้อมูลของลูกค้า เช่น customer_id, name, และ purchase
  • df2 มีข้อมูลสถานที่ (location) และระดับสมาชิก (membership_level) สำหรับลูกค้าใน customer_id
  • ใช้ pd.merge(df1, df2, on='customer_id', how='inner') เพื่อรวม DataFrame ทั้งสองโดยอ้างอิงจาก customer_id

ผลลัพธ์

จะได้ DataFrame ที่รวมข้อมูลจาก df1 และ df2 โดยใช้ customer_id ซึ่งเป็นคีย์ร่วม ข้อมูลที่ไม่ตรงกันใน customer_id จะถูกตัดออกเพราะใช้ how='inner' ซึ่งจะรวมเฉพาะข้อมูลที่มีอยู่ในทั้งสอง DataFrame เท่านั้น

   customer_id     name  purchase    location membership_level
0 1 Alice 100 Bangkok Gold
1 2 Bob 150 Chiang Mai Silver
2 3 Charlie 200 Phuket Gold

ประเภทของการ Merge:

  • how='inner': รวมเฉพาะข้อมูลที่มีคีย์ร่วมกันในทั้งสอง DataFrame
  • how='left': รวมข้อมูลทั้งหมดจาก DataFrame แรกและเติมข้อมูลจาก DataFrame ที่สอง (ถ้าไม่มีข้อมูลตรงกัน จะเติมด้วย NaN)
  • how='right': รวมข้อมูลทั้งหมดจาก DataFrame ที่สองและเติมข้อมูลจาก DataFrame แรก
  • how='outer': รวมข้อมูลทั้งหมดจากทั้งสอง DataFrame

Joining

Joining คือการรวมข้อมูลจากสอง DataFrame หรือมากกว่าที่มีข้อมูลเกี่ยวข้องกัน โดยเชื่อมโยงคอลัมน์ที่เป็นคีย์หรือ index ร่วมกัน ซึ่งการ Join สามารถกำหนดเงื่อนไขในการรวมได้หลายรูปแบบ เช่น inner join, left join, right join, และ outer join เพื่อกำหนดว่าจะรวมเฉพาะข้อมูลที่ตรงกัน หรือรวมทั้งหมดแล้วเติมค่า NaN ในกรณีที่ไม่มีข้อมูลตรงกัน

ตัวอย่างการใช้ Joining ใน Python ด้วย pandas:

import pandas as pd

# ตัวอย่าง DataFrame แรก
df1 = pd.DataFrame({
'customer_id': [1, 2, 3, 4],
'name': ['Alice', 'Bob', 'Charlie', 'David']
})

# ตัวอย่าง DataFrame ที่สอง
df2 = pd.DataFrame({
'customer_id': [1, 2, 3, 5],
'location': ['Bangkok', 'Chiang Mai', 'Phuket', 'Pattaya']
})

# ตั้งค่าให้คอลัมน์ customer_id เป็น index เพื่อใช้ในการ join
df1.set_index('customer_id', inplace=True)
df2.set_index('customer_id', inplace=True)

# การ Joining DataFrame ทั้งสองโดยใช้ index 'customer_id'
joined_df = df1.join(df2, how='inner') # ใช้ 'inner join' เป็นตัวอย่าง

print("Joined DataFrame:")
print(joined_df)

อธิบายจาก code

  • df1 มีข้อมูลของลูกค้า เช่น customer_id และ name
  • df2 มีข้อมูลสถานที่ (location) ของลูกค้า
  • ใช้ set_index ตั้งค่า customer_id เป็น index ของทั้งสอง DataFrame เพื่อใช้ในการ Join
  • ใช้ df1.join(df2, how='inner') เพื่อรวมข้อมูลเฉพาะลูกค้าที่มี customer_id ตรงกันในทั้งสอง DataFrame โดยกำหนด how='inner'

ผลลัพธ์

Joined DataFrame:
name location
customer_id
1 Alice Bangkok
2 Bob Chiang Mai
3 Charlie Phuket

ประเภทของการ Join:

  • Inner Join (how='inner'): รวมเฉพาะข้อมูลที่มีคีย์ร่วมกันในทั้งสอง DataFrame
  • Left Join (how='left'): รวมข้อมูลทั้งหมดจาก DataFrame แรก และเติมข้อมูลจาก DataFrame ที่สอง (ถ้าไม่มีข้อมูลตรงกัน จะเติมด้วย NaN)
  • Right Join (how='right'): รวมข้อมูลทั้งหมดจาก DataFrame ที่สอง และเติมข้อมูลจาก DataFrame แรก
  • Outer Join (how='outer'): รวมข้อมูลทั้งหมดจากทั้งสอง DataFrame

ความแตกต่างระหว่าง merge กับ join

หลายคนอ่านถึงตรงนี้ อาจจะสงสัยว่า ในเมื่อผลลัพธ์เหมือนกัน แล้ว merge กับ join นั้นมีความแตกต่างกันอย่างไร ?

merge และ join ใน pandas เป็นฟังก์ชันที่ใช้สำหรับรวมข้อมูลใน DataFrame โดยมีหลักการทำงานที่คล้ายกัน แต่มีความแตกต่างในด้านการใช้งานและข้อจำกัดในบางกรณี ดังนี้

  1. การอ้างอิงคีย์สำหรับการรวมข้อมูล:
    • merge: สามารถรวมข้อมูลโดยอ้างอิงจากคอลัมน์หรือ index ได้ จึงมีความยืดหยุ่นในการกำหนดคีย์มากกว่า สามารถใช้ on, left_on, และ right_on เพื่อระบุคีย์เฉพาะในแต่ละ DataFrame ได้
    • join: จะรวมข้อมูลโดยอ้างอิงจาก index เป็นหลัก ดังนั้นการใช้ join จะเหมาะสมในกรณีที่ข้อมูลมีการตั้งค่า index พร้อมแล้ว
  2. โครงสร้างและความยืดหยุ่นในการรวมข้อมูล:
    • merge: ใช้ได้ทั้งกับคอลัมน์และ index ที่เป็นคีย์ ทำให้รองรับการรวมข้อมูลที่มีโครงสร้างซับซ้อน เช่น การรวมที่มีหลายคีย์
    • join: ถูกออกแบบมาให้ใช้งานง่ายและรวดเร็วในกรณีที่ต้องการรวมข้อมูลตาม index เท่านั้น โดยมีข้อจำกัดว่าควรใช้กับ index เป็นหลัก
  3. การอ่านและความกระชับของโค้ด:
    • join: โค้ดที่ใช้ join จะกระชับและอ่านง่ายกว่าเมื่อใช้กับ DataFrame ที่มี index ตรงกัน
    • merge: การใช้ merge อาจต้องกำหนดพารามิเตอร์เพิ่มเติม เช่น left_on, right_on เพื่อระบุคีย์ในบางกรณี แต่จะให้การควบคุมที่มากกว่า

ตัวอย่างการใช้งานและความแตกต่าง

ตัวอย่างที่ 1: ใช้ merge เมื่อรวมโดยอิงจากคอลัมน์

import pandas as pd

# DataFrame แรก
df1 = pd.DataFrame({
'customer_id': [1, 2, 3, 4],
'name': ['Alice', 'Bob', 'Charlie', 'David']
})

# DataFrame ที่สอง
df2 = pd.DataFrame({
'customer_id': [1, 2, 3, 5],
'purchase': [100, 150, 200, 250]
})

# การใช้ merge โดยระบุ customer_id เป็นคีย์
merged_df = pd.merge(df1, df2, on='customer_id', how='inner')

print("Merged DataFrame using merge with column 'customer_id':")
print(merged_df)

ผลลัพธ์: merge จะรวมข้อมูลโดยอิงจากคอลัมน์ customer_id ซึ่งเป็นคีย์ที่กำหนดใน DataFrame ทั้งสอง

   customer_id     name  purchase
0 1 Alice 100
1 2 Bob 150
2 3 Charlie 200

ตัวอย่างที่ 2: ใช้ join เมื่อรวมโดยอิงจาก index

# ตั้งค่า customer_id เป็น index สำหรับทั้งสอง DataFrame
df1.set_index('customer_id', inplace=True)
df2.set_index('customer_id', inplace=True)

# การใช้ join โดยอิงจาก index
joined_df = df1.join(df2, how='inner')

print("Joined DataFrame using join with index 'customer_id':")
print(joined_df)

ผลลัพธ์: join จะรวมข้อมูลโดยอิงจาก index ของ DataFrame ทั้งสอง ซึ่งให้ผลลัพธ์เหมือน merge ในตัวอย่างนี้

             name  purchase
customer_id
1 Alice 100
2 Bob 150
3 Charlie 200

ตัวอย่างที่ 3: ใช้ merge กับคอลัมน์ที่ต่างกันใน DataFrame ทั้งสอง

ในบางกรณีที่คีย์ในแต่ละ DataFrame ไม่ได้มีชื่อเหมือนกัน เราสามารถใช้ merge เพื่อระบุคอลัมน์คีย์ที่แตกต่างกันระหว่างสอง DataFrame

# DataFrame ที่มีคอลัมน์ชื่อแตกต่างกัน
df1 = pd.DataFrame({
'customer_id_1': [1, 2, 3, 4],
'name': ['Alice', 'Bob', 'Charlie', 'David']
})

df2 = pd.DataFrame({
'customer_id_2': [1, 2, 3, 5],
'purchase': [100, 150, 200, 250]
})

# ใช้ merge โดยระบุคอลัมน์ที่แตกต่างกันใน DataFrame ทั้งสอง
merged_df = pd.merge(df1, df2, left_on='customer_id_1', right_on='customer_id_2', how='inner')

print("Merged DataFrame using merge with different columns 'customer_id_1' and 'customer_id_2':")
print(merged_df)

ผลลัพธ์: สามารถใช้ merge เพื่อรวมข้อมูลจากคอลัมน์ที่มีชื่อแตกต่างกันได้โดยการระบุ left_on และ right_on

   customer_id_1     name  customer_id_2  purchase
0 1 Alice 1 100
1 2 Bob 2 150
2 3 Charlie 3 200

ดังนั้น หากเราจะสรุปคือ

  • ใช้ merge เมื่อ:
    • ต้องการรวมข้อมูลโดยอิงจากคอลัมน์ที่เป็นคีย์
    • ต้องการรวมข้อมูลที่มีคีย์หลายตัว หรือคีย์ที่มีชื่อแตกต่างกันในแต่ละ DataFrame
    • ต้องการความยืดหยุ่นสูงในการกำหนดคีย์การรวม
  • ใช้ join เมื่อ:
    • ต้องการรวมข้อมูลโดยอิงจาก index ที่มีอยู่แล้ว
    • ต้องการโค้ดที่อ่านง่ายและกระชับ

แต่เอาจริง จากประสบการณ์ส่วนตัว merge นั้น สามารถเป็นได้ทั้ง merge และ join โดยเราสามารถใช้ merge ให้ได้ผลลัพธ์เหมือนกับการรวมโดยอิงจาก index ได้ โดยใช้พารามิเตอร์ left_index=True และ right_index=True เพื่อบอกให้ pandas ใช้ index ของทั้งสอง DataFrame ในการรวมข้อมูล

เช่น ตัวอย่างนี้จะแสดงวิธีการใช้ merge โดยอิงจาก index เพื่อให้ได้ผลลัพธ์ที่เหมือนกับ join ในตัวอย่างที่ 1

import pandas as pd

# DataFrame แรก ตั้งค่า customer_id เป็น index
df1 = pd.DataFrame({
'customer_id': [1, 2, 3, 4],
'name': ['Alice', 'Bob', 'Charlie', 'David']
}).set_index('customer_id')

# DataFrame ที่สอง ตั้งค่า customer_id เป็น index
df2 = pd.DataFrame({
'customer_id': [1, 2, 3, 5],
'purchase': [100, 150, 200, 250]
}).set_index('customer_id')

# ใช้ merge โดยใช้ index ของทั้งสอง DataFrame
merged_df = pd.merge(df1, df2, left_index=True, right_index=True, how='inner')

print("Merged DataFrame using merge with index:")
print(merged_df)

ผลลัพธ์: การใช้ merge โดยอิงจาก index ของทั้งสอง DataFrame จะให้ผลลัพธ์เดียวกับการใช้ join เช่นกัน

Reference เพิ่มเติม: https://stackoverflow.com/questions/22676081/what-is-the-difference-between-join-and-merge-in-pandas

Concatenating datasets

Concatenating datasets คือการต่อหรือรวมข้อมูลจากหลาย DataFrame เข้าด้วยกัน โดยไม่จำเป็นต้องมีคีย์หรือ index ร่วมกันเสมอไป การ Concatenate จะทำการวางข้อมูลต่อกันตามแนวตั้งหรือแนวนอน ขึ้นอยู่กับการกำหนด ซึ่งจะช่วยให้การจัดการข้อมูลที่อยู่แยกกันหลายส่วนเป็นไปได้ง่ายขึ้น เช่น การรวมข้อมูลรายเดือนจากหลาย DataFrame ให้เป็นหนึ่ง DataFrame เดียว

การ Concatenate ใน pandas สามารถใช้คำสั่ง pd.concat() ซึ่งจะทำให้การรวม DataFrame ทำได้ทั้งในแนวตั้ง (axis=0) และแนวนอน (axis=1)

ตัวอย่างการใช้ Concatenate

ตัวอย่างที่ 1: การต่อข้อมูลในแนวตั้ง (ต่อแถวตามปกติ)

import pandas as pd

# DataFrame แรก
df1 = pd.DataFrame({
'customer_id': [1, 2, 3],
'name': ['Alice', 'Bob', 'Charlie']
})

# DataFrame ที่สอง
df2 = pd.DataFrame({
'customer_id': [4, 5, 6],
'name': ['David', 'Eve', 'Frank']
})

# Concatenate DataFrame ทั้งสองในแนวตั้ง (default คือ axis=0)
concatenated_df = pd.concat([df1, df2])

print("Concatenated DataFrame (vertical):")
print(concatenated_df)

ผลลัพธ์: การ Concatenate ในแนวตั้งจะรวมข้อมูลของทั้งสอง DataFrame ให้เรียงต่อกัน

   customer_id     name
0 1 Alice
1 2 Bob
2 3 Charlie
0 4 David
1 5 Eve
2 6 Frank

ตัวอย่างที่ 2: การต่อข้อมูลในแนวนอน (ต่อ column จาก 2 dataframe)

หากต้องการ Concatenate ในแนวนอน (ตาม axis=1) สามารถทำได้โดยการตั้ง axis=1 เพื่อวางข้อมูลตามแนวนอน

import pandas as pd

# DataFrame แรก
df1 = pd.DataFrame({
'customer_id': [1, 2, 3],
'name': ['Alice', 'Bob', 'Charlie']
})

# DataFrame เพิ่มเติมสำหรับการ Concatenate แนวนอน
df3 = pd.DataFrame({
'purchase': [100, 150, 200]
})

# Concatenate DataFrame แนวนอน
concatenated_df_horizontal = pd.concat([df1, df3], axis=1)

print("Concatenated DataFrame (horizontal):")
print(concatenated_df_horizontal)

ผลลัพธ์: การ Concatenate ในแนวนอนจะวางข้อมูลจากแต่ละ DataFrame ต่อกันตามแนวนอน

   customer_id     name  purchase
0 1 Alice 100
1 2 Bob 150
2 3 Charlie 200

ดังนั้น

  • การ Concatenate ในแนวตั้ง (Vertical Concatenation): pd.concat([df1, df2], axis=0) (ค่า default คือ axis=0) เหมาะสำหรับการต่อข้อมูลที่มีโครงสร้างคอลัมน์เหมือนกัน เพื่อให้ข้อมูลเรียงต่อกันในแนวตั้ง
  • การ Concatenate ในแนวนอน (Horizontal Concatenation): pd.concat([df1, df3], axis=1) ใช้สำหรับการรวมข้อมูลที่อาจจะมีโครงสร้างคอลัมน์ต่างกัน และต้องการต่อข้อมูลในแนวนอน

Pivot

Pivot ใน pandas คือการปรับเปลี่ยนรูปแบบของข้อมูลจากลักษณะแถวให้กลายเป็นตาราง (หรือ Pivot Table) โดยการนำค่าในคอลัมน์ใดคอลัมน์หนึ่งมาเป็นตัวกำหนดชื่อคอลัมน์ใหม่ ซึ่งช่วยให้การดูข้อมูลและการวิเคราะห์ทำได้สะดวกมากขึ้น

โดยทั่วไป pivot จะช่วยให้สามารถจัดกลุ่มข้อมูลได้ดีขึ้น เหมาะสำหรับการสร้างรายงานสรุปเชิงวิเคราะห์หรือเปรียบเทียบข้อมูล

ตัวอย่างการใช้ Pivot ใน Python

import pandas as pd

# ตัวอย่าง DataFrame
data = {
'date': ['2024-01-01', '2024-01-01', '2024-01-02', '2024-01-02'],
'product': ['A', 'B', 'A', 'B'],
'sales': [100, 150, 200, 250]
}

df = pd.DataFrame(data)

print("Original DataFrame:")
print(df)

ผลลัพธ์ของ DataFrame เริ่มต้น:

         date product  sales
0 2024-01-01 A 100
1 2024-01-01 B 150
2 2024-01-02 A 200
3 2024-01-02 B 250

ซึ่งการ Pivot Data นั้นใน pandas สามารถทำได้ด้วยคำสั่ง .pivot

คำสั่ง .pivot ใน pandas ใช้สำหรับการเปลี่ยนแปลงรูปแบบข้อมูลใน DataFrame จากข้อมูลที่อยู่ในรูปแบบ "long" (มีหลายแถวที่มีค่าที่ซ้ำกันในคอลัมน์หนึ่ง ๆ) ไปเป็นรูปแบบ "wide" (โดยแปลงค่าในคอลัมน์ให้กลายเป็นหัวของคอลัมน์ใหม่) ซึ่งช่วยให้การอ่านและการวิเคราะห์ข้อมูลง่ายขึ้น โดยเฉพาะในกรณีที่ต้องการดูข้อมูลแบบสรุปจากหลายๆ มิติ

โดยคำสั่ง .pivot มีรูปแบบดังนี้

DataFrame.pivot(index=None, columns=None, values=None)
  • index: ระบุคอลัมน์ที่จะใช้เป็นแถวใน DataFrame ที่แปลงแล้ว (เช่น วันที่, ชื่อคน)
  • columns: ระบุคอลัมน์ที่จะใช้เป็นคอลัมน์ใหม่ (เช่น ประเภทสินค้า, ประเภทข้อมูล)
  • values: ระบุคอลัมน์ที่จะใช้เป็นค่าใน DataFrame ใหม่ (เช่น ยอดขาย, จำนวน)

สำหรับในตัวอย่างนี้ เราจะเปลี่ยน date เป็นแถว (index) และ product เป็นคอลัมน์ โดยให้ค่าสำหรับแต่ละคอลัมน์ใหม่ (A, B) เป็นยอดขาย (sales)

# การใช้ pivot โดยกำหนด index เป็น 'date', columns เป็น 'product', values เป็น 'sales'
pivot_df = df.pivot(index='date', columns='product', values='sales')

print("Pivoted DataFrame:")
print(pivot_df)

คำอธิบาย code

  • index='date': กำหนดให้ date เป็น index ของ DataFrame
  • columns='product': กำหนดให้ค่าของคอลัมน์ product เป็นชื่อคอลัมน์ใหม่
  • values='sales': กำหนดให้ค่าของแต่ละช่องในตารางเป็นยอดขาย (sales)

ผลลัพธ์ของ Pivoted DataFrame

product          A    B
date
2024-01-01 100 150
2024-01-02 200 250

Reshaping Data

การ Reshaping data คือการปรับเปลี่ยนโครงสร้างของข้อมูลใน DataFrame เพื่อให้เหมาะสมกับการวิเคราะห์ การจัดการข้อมูล หรือการสร้างรายงาน การ Reshape ข้อมูลใน pandas สามารถทำได้หลายวิธี เช่น การใช้ pivot เพื่อเปลี่ยนจากรูปแบบแถวเป็นตาราง (ที่เราพึ่งพูดถึงเมื่อกี้) และการใช้ melt เพื่อเปลี่ยนข้อมูลจากรูปแบบกว้าง (wide) เป็นรูปแบบยาว (long)

เรามาลองดูตัวอย่างการ Reshaping แบบ 2 วิธีเทียบกัน

ตัวอย่าง 1: Reshaping Data with melt

melt จะช่วยในการเปลี่ยนข้อมูลจากรูปแบบกว้าง (wide) เป็นรูปแบบยาว (long) เหมาะสำหรับการจัดข้อมูลให้อยู่ในรูปแบบที่เหมาะสมกับการวิเคราะห์เพิ่มเติม

import pandas as pd

# DataFrame แบบกว้าง
df = pd.DataFrame({
'date': ['2024-01-01', '2024-01-02', '2024-01-03'],
'A_sales': [100, 150, 130],
'B_sales': [200, 250, 220]
})

print("Original Wide DataFrame:")
print(df)

ผลลัพธ์ DataFrame แบบกว้าง

         date  A_sales  B_sales
0 2024-01-01 100 200
1 2024-01-02 150 250
2 2024-01-03 130 220

ใช้ melt เพื่อเปลี่ยนเป็นรูปแบบยาว

# ใช้ melt เพื่อเปลี่ยนจากรูปแบบ wide เป็น long
melted_df = pd.melt(df, id_vars=['date'], var_name='product', value_name='sales')

print("Melted DataFrame (Long Format):")
print(melted_df)

อธิบาย code

  • id_vars=['date'] ระบุคอลัมน์ที่ต้องการคงไว้ (date ในกรณีนี้)
  • var_name='product' กำหนดชื่อคอลัมน์ใหม่สำหรับชื่อของคอลัมน์ที่ถูก melt (ในที่นี้คือ A_sales และ B_sales)
  • value_name='sales' กำหนดชื่อคอลัมน์สำหรับค่าในคอลัมน์เดิม

ผลลัพธ์ DataFrame แบบยาว

         date  product  sales
0 2024-01-01 A_sales 100
1 2024-01-02 A_sales 150
2 2024-01-03 A_sales 130
3 2024-01-01 B_sales 200
4 2024-01-02 B_sales 250
5 2024-01-03 B_sales 220

ตัวอย่าง 2: Reshaping Data with pivot

pivot จะช่วยในการเปลี่ยนข้อมูลจากรูปแบบยาว (long) กลับไปเป็นรูปแบบกว้าง (wide) โดยใช้คอลัมน์หนึ่งเป็น index และคอลัมน์อื่นเป็นคอลัมน์ใหม่ในตาราง

# DataFrame แบบยาว (ที่ได้จากการ melt ข้างต้น)
melted_df = pd.DataFrame({
'date': ['2024-01-01', '2024-01-01', '2024-01-02', '2024-01-02', '2024-01-03', '2024-01-03'],
'product': ['A_sales', 'B_sales', 'A_sales', 'B_sales', 'A_sales', 'B_sales'],
'sales': [100, 200, 150, 250, 130, 220]
})

print("Original Long DataFrame:")
print(melted_df)

ผลลัพธ์ DataFrame แบบยาว

         date  product  sales
0 2024-01-01 A_sales 100
1 2024-01-01 B_sales 200
2 2024-01-02 A_sales 150
3 2024-01-02 B_sales 250
4 2024-01-03 A_sales 130
5 2024-01-03 B_sales 220

ใช้ pivot เพื่อเปลี่ยนเป็นรูปแบบกว้าง

# ใช้ pivot เพื่อเปลี่ยนจาก long format เป็น wide format
pivoted_df = melted_df.pivot(index='date', columns='product', values='sales')

print("Pivoted DataFrame (Wide Format):")
print(pivoted_df)

คำอธิบาย code

  • index='date' กำหนดให้ date เป็น index ของ DataFrame
  • columns='product' กำหนดให้ค่าใน product เป็นคอลัมน์ใหม่
  • values='sales' กำหนดให้คอลัมน์ sales เป็นค่าของแต่ละช่องในตาราง

ผลลัพธ์ DataFrame แบบกว้าง:

product     A_sales  B_sales
date
2024-01-01 100 200
2024-01-02 150 250
2024-01-03 130 220

ซึ่งถ้าเราลองดูเชิงผลลัพธ์มาเทียบกันจริงๆ melt กับ pivot คือการทำงานแบบกลับกันนั่นเอง !

  • pivot ใช้ในการเปลี่ยนข้อมูลจากรูปแบบยาว (long format) ไปเป็นรูปแบบกว้าง (wide format) โดยสร้างคอลัมน์ใหม่จากค่าของคอลัมน์ที่กำหนด
  • melt ใช้ในการเปลี่ยนข้อมูลจากรูปแบบกว้าง (wide format) ไปเป็นรูปแบบยาว (long format) โดยนำคอลัมน์หลาย ๆ คอลัมน์มารวมกันเป็นคอลัมน์เดียว

ดังนั้น หากเราทำโจทย์ไหน และต้องมี Reshape data ให้นึกถึง keyword ว่าเราจะเปลี่ยน long เป็น wide หรือ wide เป็น long จะช่วยทำให้เราหยิบคำสั่งมาใช้งานได้ง่ายขึ้นเช่นกัน