Skip to content

Pivot & Reshape

ข้อมูลเดียวกันจัดเก็บได้ 2 รูปแบบ: Wide (กว้าง) และ Long (ยาว) การแปลงไปมาเป็นทักษะสำคัญที่ต้องรู้

import pandas as pd
# Wide format — แต่ละเดือนเป็น column
wide = pd.DataFrame({
"product": ["เสื้อ", "กางเกง"],
"jan": [100, 80],
"feb": [120, 90],
"mar": [110, 85]
})
# product jan feb mar
# 0 เสื้อ 100 120 110
# 1 กางเกง 80 90 85
# Long format — เดือนเป็นค่าใน column
# product | month | sales
# เสื้อ | jan | 100
# เสื้อ | feb | 120
# ...
long = wide.melt(
id_vars=["product"], # column ที่คงไว้
value_vars=["jan", "feb", "mar"], # column ที่จะ unpivot
var_name="month", # ชื่อ column ใหม่สำหรับ header
value_name="sales" # ชื่อ column ใหม่สำหรับค่า
)
print(long)
# product month sales
# 0 เสื้อ jan 100
# 1 กางเกง jan 80
# 2 เสื้อ feb 120
# 3 กางเกง feb 90
# 4 เสื้อ mar 110
# 5 กางเกง mar 85

.pivot_table() — Long → Wide (พร้อม aggregate)

Section titled “.pivot_table() — Long → Wide (พร้อม aggregate)”
# สร้างข้อมูล long
sales = pd.DataFrame({
"product": ["เสื้อ", "เสื้อ", "เสื้อ", "กางเกง", "กางเกง", "กางเกง"],
"region": ["กรุงเทพ", "เชียงใหม่", "กรุงเทพ", "กรุงเทพ", "เชียงใหม่", "กรุงเทพ"],
"amount": [500, 300, 450, 600, 200, 350]
})
# pivot_table — สรุปยอดขายตาม product x region
pivot = sales.pivot_table(
values="amount",
index="product",
columns="region",
aggfunc="sum",
fill_value=0
)
print(pivot)
# region กรุงเทพ เชียงใหม่
# product
# กางเกง 950 200
# เสื้อ 950 300
# .pivot() — ใช้เมื่อไม่ต้อง aggregate (ค่าไม่ซ้ำ)
# .pivot_table() — ใช้ได้เสมอ เพราะมี aggfunc จัดการค่าซ้ำ
pivot = sales.pivot_table(
values="amount",
index="product",
columns="region",
aggfunc=["sum", "mean", "count"],
fill_value=0,
margins=True # เพิ่มแถว/คอลัมน์ All (รวมทั้งหมด)
)