groupby ใน pandas ผมใช้สำหรับจัดกลุ่มข้อมูลใน DataFrame แล้วคำนวณค่าสรุปในแต่ละกลุ่ม เช่น หาผลรวม ค่าเฉลี่ย หรือค่าสถิติต่างๆ ตามหมวดหมู่ที่กำหนด ถ้าใครเคยใช้ PivotTable ใน Excel มาก่อน บอกเลยว่าตัวนี้คือเครื่องมือสายเดียวกันเลยครับ
df.groupby(by)
df.groupby(by)
DataFrameGroupByคืนเป็น object กึ่งสำเร็จ (DataFrameGroupBy) ที่ยังไม่ใช่ตารางครับ — pandas แค่จัดกลุ่มแถวรอไว้ ต้องตามด้วย .sum() / .mean() / .agg() เพื่อบอกว่าจะสรุปแต่ละกลุ่มยังไง ถึงจะได้ผลลัพธ์ออกมา
| Argument | Type | Required | Default | Description |
|---|---|---|---|---|
| by | str | list | Yes | ชื่อคอลัมน์ที่ใช้จัดกลุ่ม เช่น ‘city’ หรือ [‘dept’, ‘year’] สำหรับจัดกลุ่มหลายคอลัมน์พร้อมกัน |
df.groupby('city')['sales'].sum()df.groupby('city')['sales'].sum()
city
Bangkok 250
Chiang Mai 450
Name: sales, dtype: int64
df.groupby('dept')['salary'].mean()df.groupby('dept')['salary'].mean()
dept
HR 55000.0
IT 80000.0
Name: salary, dtype: float64
df.groupby('dept')['salary'].agg(['sum', 'mean', 'max'])df.groupby('dept')['salary'].agg(['sum', 'mean', 'max'])
sum mean max
dept
HR 110000 55000.0 60000
IT 240000 80000.0 90000
ต่างกันเยอะมากครับ 😅 groupby เร็วกว่าเพราะเบื้องหลังมันทำงานในภาษา C ไม่ได้วน loop ใน Python ทีละแถว ข้อมูลระดับ 1 ล้านแถว groupby เสร็จในหลัก milliseconds แต่ถ้าเขียน for loop เองอาจรอหลายวินาที ส่วนตัวผมเลยไม่เขียน loop จัดกลุ่มเองแล้วครับ ปวดหัวเปล่าๆ
ได้เลยครับ แค่ใส่ชื่อคอลัมน์เป็น list เช่น df.groupby([‘dept’, ‘year’])[‘salary’].mean() ก็จะได้ค่าเฉลี่ยแยกตามแผนกและปีพร้อมกัน เหมือนเราลากหลายฟิลด์เข้า Rows ใน PivotTable นั่นแหละครับ
ถ้าให้ผมเลือกฟังก์ชันที่ใช้บ่อยที่สุดตอนวิเคราะห์ข้อมูลด้วย pandas groupby ต้องติดอันดับต้นๆ แน่นอนครับ 😎
แนวคิดหลักของมันคือ Split-Apply-Combine ฟังดูเท่ๆ แต่พูดง่ายๆ คือ “แบ่งกลุ่ม-คำนวณ-รวมผล”:
– Split: แบ่งข้อมูลออกเป็นกลุ่มตามเงื่อนไข เช่น แบ่งตามเมือง ตามแผนก
– Apply: คำนวณค่าในแต่ละกลุ่มแยกกัน เช่น หาผลรวม หาค่าเฉลี่ย
– Combine: รวมผลลัพธ์กลับมาเป็น DataFrame หรือ Series ให้เราเอาไปใช้ต่อ
งานจริงที่ผมเจอบ่อยก็ประมาณ หายอดขายรวมแต่ละเมือง หาเงินเดือนเฉลี่ยแต่ละแผนก หรือนับจำนวนสินค้าในแต่ละหมวดหมู่ครับ
ที่เจ๋งคือ groupby ใช้คู่กับฟังก์ชัน agg ได้ ทำให้คำนวณหลายค่าพร้อมกันในคำสั่งเดียวเลย ไม่ต้องเขียนทีละบรรทัด ✨