Thep Excel

pandas groupbyจัดกลุ่มข้อมูลและคำนวณแบบกลุ่ม

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

>_
df.groupby(by)

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

อัปเดต 31 May 2026

Syntax & Arguments

คืนค่าDataFrameGroupByต้อง chain ต่อ

คืนเป็น object กึ่งสำเร็จ (DataFrameGroupBy) ที่ยังไม่ใช่ตารางครับ — pandas แค่จัดกลุ่มแถวรอไว้ ต้องตามด้วย .sum() / .mean() / .agg() เพื่อบอกว่าจะสรุปแต่ละกลุ่มยังไง ถึงจะได้ผลลัพธ์ออกมา

อาร์กิวเมนต์ ชนิด คำอธิบาย
by str | list ชื่อคอลัมน์ที่ใช้จัดกลุ่ม เช่น ‘city’ หรือ [‘dept’, ‘year’] สำหรับจัดกลุ่มหลายคอลัมน์พร้อมกัน

Additional Notes

ถ้าให้ผมเลือกฟังก์ชันที่ใช้บ่อยที่สุดตอนวิเคราะห์ข้อมูลด้วย pandas groupby ต้องติดอันดับต้นๆ แน่นอนครับ 😎

แนวคิดหลักของมันคือ Split-Apply-Combine ฟังดูเท่ๆ แต่พูดง่ายๆ คือ “แบ่งกลุ่ม-คำนวณ-รวมผล”:
– Split: แบ่งข้อมูลออกเป็นกลุ่มตามเงื่อนไข เช่น แบ่งตามเมือง ตามแผนก
– Apply: คำนวณค่าในแต่ละกลุ่มแยกกัน เช่น หาผลรวม หาค่าเฉลี่ย
– Combine: รวมผลลัพธ์กลับมาเป็น DataFrame หรือ Series ให้เราเอาไปใช้ต่อ

งานจริงที่ผมเจอบ่อยก็ประมาณ หายอดขายรวมแต่ละเมือง หาเงินเดือนเฉลี่ยแต่ละแผนก หรือนับจำนวนสินค้าในแต่ละหมวดหมู่ครับ

ที่เจ๋งคือ groupby ใช้คู่กับฟังก์ชัน agg ได้ ทำให้คำนวณหลายค่าพร้อมกันในคำสั่งเดียวเลย ไม่ต้องเขียนทีละบรรทัด ✨

Examples

ตัวอย่างที่ 1: หายอดขายรวมแต่ละเมืองdf.groupby('city')['sales'].sum()

ผมจัดกลุ่มข้อมูลตามคอลัมน์ city แล้วรวมยอดขายในแต่ละเมือง Bangkok ได้ 250 (100+150) ส่วน Chiang Mai ได้ 450 (200+250) ครับ เขียนบรรทัดเดียวจบเลย

>_
df.groupby('city')['sales'].sum()

ผลลัพธ์city
Bangkok 250
Chiang Mai 450
Name: sales, dtype: int64
ตัวอย่างที่ 2: หาเงินเดือนเฉลี่ยแต่ละแผนกdf.groupby('dept')['salary'].mean()

คราวนี้ผมเปลี่ยนจาก sum มาเป็น mean เพื่อหาค่าเฉลี่ยเงินเดือนแต่ละแผนก แผนก HR มีพนักงาน 2 คน เฉลี่ยได้ 55,000 บาท ส่วน IT มี 3 คน เฉลี่ย 80,000 บาทครับ

>_
df.groupby('dept')['salary'].mean()

ผลลัพธ์dept
HR 55000.0
IT 80000.0
Name: salary, dtype: float64
ตัวอย่างที่ 3: คำนวณหลายค่าสถิติพร้อมกันด้วย aggdf.groupby('dept')['salary'].agg(['sum', 'mean', 'max'])

อันนี้คือลูกเล่นที่ผมชอบมากครับ ใช้ agg สั่งคำนวณ sum, mean, max ของเงินเดือนในแต่ละแผนกพร้อมกันรวดเดียว ได้ผลออกมาเป็น DataFrame 3 คอลัมน์เลย ไม่ต้องเขียนแยก 3 รอบ 💡

>_
df.groupby('dept')['salary'].agg(['sum', 'mean', 'max'])

ผลลัพธ์ sum mean max
dept
HR 110000 55000.0 60000
IT 240000 80000.0 90000

FAQs

ต่างจากการเขียน for loop วนจัดกลุ่มเองยังไง?+

ต่างกันเยอะมากครับ 😅 groupby เร็วกว่าเพราะเบื้องหลังมันทำงานในภาษา C ไม่ได้วน loop ใน Python ทีละแถว ข้อมูลระดับ 1 ล้านแถว groupby เสร็จในหลัก milliseconds แต่ถ้าเขียน for loop เองอาจรอหลายวินาที ส่วนตัวผมเลยไม่เขียน loop จัดกลุ่มเองแล้วครับ ปวดหัวเปล่าๆ

จัดกลุ่มตามหลายคอลัมน์พร้อมกันได้ไหม?+

ได้เลยครับ แค่ใส่ชื่อคอลัมน์เป็น list เช่น df.groupby(['dept', 'year'])['salary'].mean() ก็จะได้ค่าเฉลี่ยแยกตามแผนกและปีพร้อมกัน เหมือนเราลากหลายฟิลด์เข้า Rows ใน PivotTable นั่นแหละครับ

Resources & Related

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

ฟังก์ชันนี้pandas groupbyAggregation
Transform (5)
pandas apply

apply ใน pandas ผมใช้สำหรับรันฟังก์ชันกับแต่ละแถวหรือแต่ละคอลัมน์ใน DataFrame หรือรันกับแต่ละค่าใน Series ตอนที่ต้องการ logic ซับซ้อนที่ vectorized operations ทำไม่ได้ครับ

pandas .dt

pandas .dt accessor ผมใช้สำหรับดึงส่วนต่างๆ ของวันที่ออกจาก datetime Series เช่น ปี เดือน วัน ชื่อวัน หรือไตรมาส เหมือนกับที่ Excel มีฟังก์ชัน YEAR() MONTH() DAY() WEEKDAY() แต่ทำได้กับทั้งคอลัมน์พร้อมกันในคำสั่งเดียวเลยครับ

pandas melt

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

pandas reset_index

reset_index ผมใช้สำหรับเปลี่ยน index ของ DataFrame กลับมาเป็นคอลัมน์ธรรมดา แล้วเซ็ต index ใหม่เป็น 0, 1, 2, … ตามลำดับ — ส่วนใหญ่จะโผล่หลัง groupby ทุกครั้งที่อยากนำผลลัพธ์ไปใช้งานต่อครับ

pandas sort_values

df.sort_values() ใน pandas ผมใช้สำหรับเรียงลำดับแถวใน DataFrame ตามค่าของคอลัมน์ที่กำหนด เรียงจากน้อยไปมากหรือมากไปน้อยก็ได้ และยังเรียงตามหลายคอลัมน์พร้อมกันได้ด้วยครับ

Aggregation (5)
pandas describe

df.describe() ใน pandas ผมใช้สำหรับดูสถิติพื้นฐานของข้อมูลในทุกคอลัมน์พร้อมกันในคำสั่งเดียว ทั้ง count, mean, std, min, max และ percentile ช่วยให้เข้าใจภาพรวมของชุดข้อมูลได้เร็วมากก่อนเริ่มวิเคราะห์จริงครับ

pandas mean

df.mean() ใน pandas ผมใช้หาค่าเฉลี่ยของแต่ละคอลัมน์ใน DataFrame ทีละรอบเดียว เหมือนกับพิมพ์ AVERAGE ทุกคอลัมน์พร้อมกันเลยครับ ถ้าต้องการแค่คอลัมน์เดียวก็ใช้ df['col'].mean() ได้ค่าตัวเลขออกมาเลย

pandas pivot_table

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

pandas sum

df.sum() ผมใช้รวมค่าตัวเลขใน DataFrame ครับ ถ้าใครคุ้นกับ SUM ใน Excel ตัวนี้คือ SUM นั่นแหละ แต่ของแถมคือมันลากรวมให้ทุกคอลัมน์พร้อมกันในคำสั่งเดียว ไม่ต้องลากสูตรทีละช่อง

pandas value_counts

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

Combine (2)
pandas concat

pd.concat ผมใช้สำหรับนำ DataFrame หลายตัวมาเชื่อมต่อกัน จะต่อแนวตั้ง (กองแถว) หรือแนวนอน (เพิ่มคอลัมน์) ก็ได้ ถ้าใครเคยใช้ Power Query ใน Excel แล้ว Append Queries คือตัวเทียบเคียงที่ใกล้เคียงที่สุดครับ

pandas merge

merge ใน pandas คือวิธีที่ผมใช้รวมสองตารางเข้าด้วยกันโดยจับคู่ตามคอลัมน์ที่กำหนด เหมือน VLOOKUP ใน Excel แต่ทรงพลังกว่ามากเพราะดึงได้ทุกคอลัมน์และรองรับ join หลายรูปแบบในคำสั่งเดียวครับ

Logic (1)
numpy where

numpy.where ผมใช้เลือกค่าจาก array ตามเงื่อนไขที่กำหนดครับ ถ้าให้เทียบง่ายๆ มันคือ IF ใน Excel นั่นแหละ แต่เก่งกว่าตรงที่ทำงานกับข้อมูลทั้ง array พร้อมกันในทีเดียว แถมยังใส่อาร์กิวเมนต์เดียวเพื่อหา index ที่ตรงเงื่อนไขได้อีกด้วย

Selection (1)
pandas query

query ใน pandas ผมใช้กรองแถวใน DataFrame ด้วยข้อความเงื่อนไขที่อ่านง่ายเหมือนพูดภาษาคน แทนที่จะเขียน boolean mask ยาวๆ ให้ตาลาย เหมาะมากกับเงื่อนไขซับซ้อนหลายข้อที่อยากให้โค้ดสั้นและอ่านรู้เรื่องครับ

Comments

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