Pivot & Reshape
Pivot & Reshape
Section titled “Pivot & Reshape”ข้อมูลเดียวกันจัดเก็บได้ 2 รูปแบบ: Wide (กว้าง) และ Long (ยาว) การแปลงไปมาเป็นทักษะสำคัญที่ต้องรู้
Wide vs Long Format
Section titled “Wide vs Long Format”import pandas as pd
# Wide format — แต่ละเดือนเป็น columnwide = 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# ....melt() — Wide → Long
Section titled “.melt() — Wide → Long”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)”# สร้างข้อมูล longsales = pd.DataFrame({ "product": ["เสื้อ", "เสื้อ", "เสื้อ", "กางเกง", "กางเกง", "กางเกง"], "region": ["กรุงเทพ", "เชียงใหม่", "กรุงเทพ", "กรุงเทพ", "เชียงใหม่", "กรุงเทพ"], "amount": [500, 300, 450, 600, 200, 350]})
# pivot_table — สรุปยอดขายตาม product x regionpivot = sales.pivot_table( values="amount", index="product", columns="region", aggfunc="sum", fill_value=0)print(pivot)# region กรุงเทพ เชียงใหม่# product# กางเกง 950 200# เสื้อ 950 300.pivot_table() vs .pivot()
Section titled “.pivot_table() vs .pivot()”# .pivot() — ใช้เมื่อไม่ต้อง aggregate (ค่าไม่ซ้ำ)# .pivot_table() — ใช้ได้เสมอ เพราะมี aggfunc จัดการค่าซ้ำหลายค่ารวม
Section titled “หลายค่ารวม”pivot = sales.pivot_table( values="amount", index="product", columns="region", aggfunc=["sum", "mean", "count"], fill_value=0, margins=True # เพิ่มแถว/คอลัมน์ All (รวมทั้งหมด))- Wide → Long: ไม่มีฟังก์ชันตรงๆ — ต้อง copy/paste ด้วยมือ
- Long → Wide: Insert > Pivot table
- Rows = product, Columns = region, Values = SUM(amount)
-- Pivot (PostgreSQL crosstab)SELECT * FROM crosstab( 'SELECT product, region, SUM(amount) FROM sales GROUP BY 1, 2 ORDER BY 1, 2') AS ct(product TEXT, "กรุงเทพ" INT, "เชียงใหม่" INT);-- Unpivot: UNION ALL หลาย SELECT// C ไม่มี pivot ดั้งเดิม// ต้อง allocate 2D array แล้ว loop จัดการเอง