Thep Excel

pandas pivot_tableสร้าง PivotTable จาก DataFrame แบบ Excel

pivot_table ใน pandas ผมใช้สำหรับสร้างตารางสรุปข้อมูลแบบ PivotTable เหมือนใน Excel เลยครับ — กำหนดได้ว่าจะเอาคอลัมน์ไหนเป็น rows, columns และจะรวมค่าด้วยฟังก์ชันอะไร ทั้งหมดจบในคำสั่งเดียว

>_
pd.pivot_table(data, values, index, columns, aggfunc)

ความนิยม5/10
ความยาก3/10
ประโยชน์5/10

อัปเดต 31 May 2026

Syntax & Arguments

คืนค่าDataFrame

คืนเป็น DataFrame รูปตาราง pivot ที่พร้อมใช้งานทันทีครับ ต่างจาก groupby ที่คืน GroupBy object ก่อน pivot_table คืนผลสำเร็จรูปเลย สามารถนำไปต่อด้วย .reset_index(), .to_excel(), .plot() หรือ filter ต่อได้เลย

อาร์กิวเมนต์ ชนิด ค่าเริ่มต้น คำอธิบาย
data DataFrame DataFrame ต้นทางที่จะสร้าง pivot table จาก
[values]ไม่บังคับ str | list None ชื่อคอลัมน์ที่จะนำมาคำนวณ เช่น ‘sales’ หรือ [‘sales’, ‘qty’] ถ้าไม่ระบุ pandas จะใช้ทุกคอลัมน์ที่เป็นตัวเลข
[index]ไม่บังคับ str | list None คอลัมน์ที่จะเป็น rows ของ pivot table เทียบได้กับการลากฟิลด์ลง Rows ใน Excel PivotTable
[columns]ไม่บังคับ str | list None คอลัมน์ที่จะกระจายเป็นหัวตาราง (columns) ของ pivot table เทียบได้กับการลากฟิลด์ลง Columns ใน Excel PivotTable
[aggfunc]ไม่บังคับ str | function | list | dict 'mean' ฟังก์ชันที่ใช้รวมค่า เช่น ‘sum’, ‘mean’, ‘count’, ‘max’, ‘min’ หรือส่งเป็น list [‘sum’, ‘mean’] เพื่อคำนวณหลายค่าพร้อมกัน ค่า default คือ ‘mean’
[fill_value]ไม่บังคับ scalar None ค่าที่ใช้แทน NaN เมื่อไม่มีข้อมูลในเซลล์นั้น เช่น fill_value=0 เพื่อแสดง 0 แทนช่องว่าง
[margins]ไม่บังคับ bool False ถ้า True จะเพิ่มแถวและคอลัมน์ ‘All’ ที่แสดงผลรวมทั้งหมด (Grand Total) เหมือนเปิด Grand Totals ใน Excel PivotTable
[margins_name]ไม่บังคับ str 'All' ชื่อของแถว/คอลัมน์ margins ค่า default คือ ‘All’ แต่เปลี่ยนได้ เช่น ‘รวม’
[dropna]ไม่บังคับ bool True ถ้า True จะตัดแถวที่มี NaN ออกจากการคำนวณ ถ้า False จะรวม NaN ไว้ด้วย

[ ] = อาร์กิวเมนต์ที่ไม่บังคับ

Additional Notes

ผมถือว่า pivot_table คือ “PivotTable ของ Excel ในโลก Python” เลยครับ ถ้าเคยลากฟิลด์เข้า Rows / Columns / Values ใน PivotTable มาแล้ว จะรู้สึกคุ้นมากเพราะแนวคิดเหมือนกันทุกอย่าง แค่เปลี่ยนจากคลิกมาเป็นเขียนโค้ดแทน

หลักการทำงานคือ pandas จะรับ DataFrame ดิบ แล้วจัดกลุ่มตามคอลัมน์ที่เรากำหนดใน index (แนวนอน) และ columns (แนวตั้ง) จากนั้นนำค่าใน values มาสรุปด้วย aggfunc ที่เราเลือก เช่น sum, mean, count ผลลัพธ์จะออกมาเป็น DataFrame รูปตารางไขว้ที่อ่านง่ายครับ

ที่เจ๋งคือ pivot_table รองรับ aggfunc หลายตัวพร้อมกันได้ เช่น [‘sum’, ‘mean’] และยังมี margins=True ที่เพิ่มแถวและคอลัมน์รวมทั้งหมด (Grand Total) ให้อัตโนมัติ เหมือนติ๊กถูก “Grand Totals” ใน PivotTable ของ Excel นั่นเองครับ ✨

ส่วนตัวผมชอบใช้ pivot_table ตอนอยากเห็นภาพรวมข้อมูล 2 มิติ เช่น ยอดขายแต่ละสินค้าในแต่ละเดือน หรือต้องการ cross-tab ที่พร้อมรายงานทันทีโดยไม่ต้องฟอร์แมตเพิ่ม 😎

Examples

ตัวอย่างที่ 1: หายอดขายรวมแต่ละหมวดสินค้า (1 มิติ)pd.pivot_table(df, values='sales', index='category', aggfunc='sum')

ผมสร้าง pivot table ง่ายๆ ที่จัดกลุ่มตามหมวดสินค้า (index='category') แล้วรวมยอดขาย (aggfunc='sum') ผลออกมาเป็น DataFrame ที่หัวแถวคือชื่อหมวด และ values คือยอดรวมครับ เทียบกับ Excel ก็คือลาก category ลง Rows และ sales ลง Values แล้วเลือก Sum นั่นเอง

>_
pd.pivot_table(df, values='sales', index='category', aggfunc='sum')

ผลลัพธ์ sales
category
Clothing 1000
Electronics 3500
ตัวอย่างที่ 2: ตารางไขว้ยอดขายตามหมวดสินค้าและเดือน (2 มิติ)pd.pivot_table(df, values='sales', index='category', columns='month', aggfunc='sum', fill_value=0)

คราวนี้ผมเพิ่ม columns='month' เพื่อกระจายเดือนออกเป็นหัวคอลัมน์ ได้ตารางไขว้ที่แถวคือหมวดสินค้า คอลัมน์คือเดือน ส่วน fill_value=0 ป้องกันไม่ให้ช่องที่ไม่มีข้อมูลแสดง NaN ครับ นี่คือ PivotTable แบบ 2 มิติที่ผมใช้ดูภาพรวมบ่อยมาก

>_
pd.pivot_table(df, values='sales', index='category', columns='month', aggfunc='sum', fill_value=0)

ผลลัพธ์month Feb Jan
category
Clothing 1500 400
Electronics 800 2700
ตัวอย่างที่ 3: คำนวณหลาย aggfunc พร้อมกัน (sum + mean)pd.pivot_table(df, values='sales', index='category', aggfunc=['sum', 'mean'])

ผมส่ง aggfunc เป็น list ['sum', 'mean'] เพื่อดูทั้งยอดรวมและค่าเฉลี่ยในคราวเดียวกัน ผลจะได้ MultiIndex columns ที่แบ่งเป็น 2 ระดับคือ sum และ mean ครับ ไม่ต้องเขียน pivot_table 2 ครั้งแยกกัน

>_
pd.pivot_table(df, values='sales', index='category', aggfunc=['sum', 'mean'])

ผลลัพธ์ sum mean
sales sales
category
Clothing 1000 500.000000
Electronics 3500 1166.666667
ตัวอย่างที่ 4: เพิ่ม Grand Total ด้วย margins=Truepd.pivot_table(df, values='sales', index='category', columns='month', aggfunc='sum', fill_value=0, margins=True)

เพิ่ม margins=True เพื่อให้ pandas ใส่แถว 'All' และคอลัมน์ 'All' ที่รวมค่าทั้งหมดให้อัตโนมัติ เหมือนเปิด Grand Totals ใน Excel PivotTable เลยครับ ใช้ margins_name='รวม' เปลี่ยนชื่อได้ถ้าอยากแสดงภาษาไทย

>_
pd.pivot_table(df, values='sales', index='category', columns='month', aggfunc='sum', fill_value=0, margins=True)

ผลลัพธ์month Feb Jan All
category
Clothing 1500 400 1900
Electronics 800 2700 3500
All 2300 3100 5400

FAQs

ต่างจาก groupby ยังไง ใช้ตัวไหนดี?+

ผมมองแบบนี้ครับ: groupby เหมาะกับการสรุปค่าแบบ 1 มิติ เช่น ยอดขายรวมแต่ละเมือง ได้ผลออกมาเป็น Series หรือ DataFrame แบบยาว ส่วน pivot_table เหมาะตอนอยากได้ตารางไขว้ 2 มิติ เช่น ยอดขายแต่ละหมวดในแต่ละเดือน ถ้าต้องรายงานหรือพรีเซนต์ ผมเลือก pivot_table เพราะผลออกมาพร้อมใช้ทันทีเลยครับ

ทำไมผลออกมาเป็น NaN บางช่อง แก้ยังไง?+

เกิดเพราะไม่มีข้อมูลในหมวดหมู่นั้นๆ ครับ เช่น ไม่มีสินค้า Electronics ในเดือน March เลย ช่องก็จะว่าง วิธีแก้คือใส่ fill_value=0 เพื่อให้แสดง 0 แทน NaN ผมใช้ตัวนี้เกือบทุกครั้งที่สร้าง pivot_table เพราะตอน export ไป Excel หรือ visualize ต่อ ค่า 0 จัดการง่ายกว่า NaN มากครับ

ใช้ aggfunc='count' นับจำนวนแถวในแต่ละกลุ่มได้ไหม?+

ได้เลยครับ ใส่ aggfunc='count' แล้วระบุ values ที่ต้องการนับ ผลจะออกมาเป็นจำนวนแถวที่มีข้อมูลในแต่ละกลุ่มครับ ถ้าอยากนับทุกแถวรวมถึง NaN ให้ใช้ aggfunc='size' แทน เพราะ count ข้าม NaN แต่ size นับทุกแถวครับ

Resources & Related

ฟังก์ชันที่ผู้เขียนโยงไว้กับ pandas pivot_table จัดกลุ่มตามหมวด · ชี้ที่ชื่อใดชื่อหนึ่ง แล้วฟังก์ชันที่ใช้คู่กันจะมีจุดทอง

ฟังก์ชันนี้pandas pivot_tableAggregation
Aggregation (2)
pandas groupby

groupby ใน pandas ผมใช้สำหรับจัดกลุ่มข้อมูลใน DataFrame แล้วคำนวณค่าสรุปในแต่ละกลุ่ม เช่น หาผลรวม ค่าเฉลี่ย หรือค่าสถิติต่างๆ ตามหมวดหมู่ที่กำหนด ถ้าใครเคยใช้ PivotTable ใน Excel มาก่อน บอกเลยว่าตัวนี้คือเครื่องมือสายเดียวกันเลยครับ

pandas value_counts

Series.value_counts() ใน pandas ผมใช้สำหรับนับว่าแต่ละค่าใน column ปรากฏกี่ครั้ง ได้ผลเรียงจากมากไปน้อยอัตโนมัติ ใช้ดูการกระจายของข้อมูลหรือหาค่าที่พบบ่อยสุดได้เร็วมากครับ

Transform (1)
pandas melt

pd.melt ผมใช้แปลงตารางจากแนวกว้าง (wide) ให้เป็นแนวยาว (long) คือยุบหลายๆ คอลัมน์ให้มารวมกันเป็นคอลัมน์เดียว ถ้าใครเคยใช้ Power Query มาก่อน บอกเลยว่านี่คือคำสั่ง Unpivot นั่นแหละครับ แค่ย้ายมาเขียนใน pandas

Comments

อีเมลของคุณจะไม่ถูกเผยแพร่