groupby ใน pandas ผมใช้สำหรับจัดกลุ่มข้อมูลใน DataFrame แล้วคำนวณค่าสรุปในแต่ละกลุ่ม เช่น หาผลรวม ค่าเฉลี่ย หรือค่าสถิติต่างๆ ตามหมวดหมู่ที่กำหนด ถ้าใครเคยใช้ PivotTable ใน Excel มาก่อน บอกเลยว่าตัวนี้คือเครื่องมือสายเดียวกันเลยครับ
DataFrameGroupByต้อง chain ต่อ
คืนเป็น object กึ่งสำเร็จ (DataFrameGroupBy) ที่ยังไม่ใช่ตารางครับ — pandas แค่จัดกลุ่มแถวรอไว้ ต้องตามด้วย .sum() / .mean() / .agg() เพื่อบอกว่าจะสรุปแต่ละกลุ่มยังไง ถึงจะได้ผลลัพธ์ออกมา
| อาร์กิวเมนต์ | ชนิด | คำอธิบาย |
|---|---|---|
| by | str | list | ชื่อคอลัมน์ที่ใช้จัดกลุ่ม เช่น ‘city’ หรือ [‘dept’, ‘year’] สำหรับจัดกลุ่มหลายคอลัมน์พร้อมกัน |
ถ้าให้ผมเลือกฟังก์ชันที่ใช้บ่อยที่สุดตอนวิเคราะห์ข้อมูลด้วย pandas groupby ต้องติดอันดับต้นๆ แน่นอนครับ 😎
แนวคิดหลักของมันคือ Split-Apply-Combine ฟังดูเท่ๆ แต่พูดง่ายๆ คือ “แบ่งกลุ่ม-คำนวณ-รวมผล”:
– Split: แบ่งข้อมูลออกเป็นกลุ่มตามเงื่อนไข เช่น แบ่งตามเมือง ตามแผนก
– Apply: คำนวณค่าในแต่ละกลุ่มแยกกัน เช่น หาผลรวม หาค่าเฉลี่ย
– Combine: รวมผลลัพธ์กลับมาเป็น DataFrame หรือ Series ให้เราเอาไปใช้ต่อ
งานจริงที่ผมเจอบ่อยก็ประมาณ หายอดขายรวมแต่ละเมือง หาเงินเดือนเฉลี่ยแต่ละแผนก หรือนับจำนวนสินค้าในแต่ละหมวดหมู่ครับ
ที่เจ๋งคือ groupby ใช้คู่กับฟังก์ชัน agg ได้ ทำให้คำนวณหลายค่าพร้อมกันในคำสั่งเดียวเลย ไม่ต้องเขียนทีละบรรทัด ✨
ผมจัดกลุ่มข้อมูลตามคอลัมน์ city แล้วรวมยอดขายในแต่ละเมือง Bangkok ได้ 250 (100+150) ส่วน Chiang Mai ได้ 450 (200+250) ครับ เขียนบรรทัดเดียวจบเลย
คราวนี้ผมเปลี่ยนจาก sum มาเป็น mean เพื่อหาค่าเฉลี่ยเงินเดือนแต่ละแผนก แผนก HR มีพนักงาน 2 คน เฉลี่ยได้ 55,000 บาท ส่วน IT มี 3 คน เฉลี่ย 80,000 บาทครับ
อันนี้คือลูกเล่นที่ผมชอบมากครับ ใช้ agg สั่งคำนวณ sum, mean, max ของเงินเดือนในแต่ละแผนกพร้อมกันรวดเดียว ได้ผลออกมาเป็น DataFrame 3 คอลัมน์เลย ไม่ต้องเขียนแยก 3 รอบ 💡
ต่างกันเยอะมากครับ 😅 groupby เร็วกว่าเพราะเบื้องหลังมันทำงานในภาษา C ไม่ได้วน loop ใน Python ทีละแถว ข้อมูลระดับ 1 ล้านแถว groupby เสร็จในหลัก milliseconds แต่ถ้าเขียน for loop เองอาจรอหลายวินาที ส่วนตัวผมเลยไม่เขียน loop จัดกลุ่มเองแล้วครับ ปวดหัวเปล่าๆ
ได้เลยครับ แค่ใส่ชื่อคอลัมน์เป็น list เช่น df.groupby(['dept', 'year'])['salary'].mean() ก็จะได้ค่าเฉลี่ยแยกตามแผนกและปีพร้อมกัน เหมือนเราลากหลายฟิลด์เข้า Rows ใน PivotTable นั่นแหละครับ
ฟังก์ชันที่ผู้เขียนโยงไว้กับ pandas groupby จัดกลุ่มตามหมวด · ชี้ที่ชื่อใดชื่อหนึ่ง แล้วฟังก์ชันที่ใช้คู่กันจะมีจุดทอง
apply ใน pandas ผมใช้สำหรับรันฟังก์ชันกับแต่ละแถวหรือแต่ละคอลัมน์ใน DataFrame หรือรันกับแต่ละค่าใน Series ตอนที่ต้องการ logic ซับซ้อนที่ vectorized operations ทำไม่ได้ครับ
pandas .dt accessor ผมใช้สำหรับดึงส่วนต่างๆ ของวันที่ออกจาก datetime Series เช่น ปี เดือน วัน ชื่อวัน หรือไตรมาส เหมือนกับที่ Excel มีฟังก์ชัน YEAR() MONTH() DAY() WEEKDAY() แต่ทำได้กับทั้งคอลัมน์พร้อมกันในคำสั่งเดียวเลยครับ
pd.melt ผมใช้แปลงตารางจากแนวกว้าง (wide) ให้เป็นแนวยาว (long) คือยุบหลายๆ คอลัมน์ให้มารวมกันเป็นคอลัมน์เดียว ถ้าใครเคยใช้ Power Query มาก่อน บอกเลยว่านี่คือคำสั่ง Unpivot นั่นแหละครับ แค่ย้ายมาเขียนใน pandas
reset_index ผมใช้สำหรับเปลี่ยน index ของ DataFrame กลับมาเป็นคอลัมน์ธรรมดา แล้วเซ็ต index ใหม่เป็น 0, 1, 2, … ตามลำดับ — ส่วนใหญ่จะโผล่หลัง groupby ทุกครั้งที่อยากนำผลลัพธ์ไปใช้งานต่อครับ
df.sort_values() ใน pandas ผมใช้สำหรับเรียงลำดับแถวใน DataFrame ตามค่าของคอลัมน์ที่กำหนด เรียงจากน้อยไปมากหรือมากไปน้อยก็ได้ และยังเรียงตามหลายคอลัมน์พร้อมกันได้ด้วยครับ
df.describe() ใน pandas ผมใช้สำหรับดูสถิติพื้นฐานของข้อมูลในทุกคอลัมน์พร้อมกันในคำสั่งเดียว ทั้ง count, mean, std, min, max และ percentile ช่วยให้เข้าใจภาพรวมของชุดข้อมูลได้เร็วมากก่อนเริ่มวิเคราะห์จริงครับ
df.mean() ใน pandas ผมใช้หาค่าเฉลี่ยของแต่ละคอลัมน์ใน DataFrame ทีละรอบเดียว เหมือนกับพิมพ์ AVERAGE ทุกคอลัมน์พร้อมกันเลยครับ ถ้าต้องการแค่คอลัมน์เดียวก็ใช้ df['col'].mean() ได้ค่าตัวเลขออกมาเลย
pivot_table ใน pandas ผมใช้สำหรับสร้างตารางสรุปข้อมูลแบบ PivotTable เหมือนใน Excel เลยครับ — กำหนดได้ว่าจะเอาคอลัมน์ไหนเป็น rows, columns และจะรวมค่าด้วยฟังก์ชันอะไร ทั้งหมดจบในคำสั่งเดียว
df.sum() ผมใช้รวมค่าตัวเลขใน DataFrame ครับ ถ้าใครคุ้นกับ SUM ใน Excel ตัวนี้คือ SUM นั่นแหละ แต่ของแถมคือมันลากรวมให้ทุกคอลัมน์พร้อมกันในคำสั่งเดียว ไม่ต้องลากสูตรทีละช่อง
Series.value_counts() ใน pandas ผมใช้สำหรับนับว่าแต่ละค่าใน column ปรากฏกี่ครั้ง ได้ผลเรียงจากมากไปน้อยอัตโนมัติ ใช้ดูการกระจายของข้อมูลหรือหาค่าที่พบบ่อยสุดได้เร็วมากครับ
pd.concat ผมใช้สำหรับนำ DataFrame หลายตัวมาเชื่อมต่อกัน จะต่อแนวตั้ง (กองแถว) หรือแนวนอน (เพิ่มคอลัมน์) ก็ได้ ถ้าใครเคยใช้ Power Query ใน Excel แล้ว Append Queries คือตัวเทียบเคียงที่ใกล้เคียงที่สุดครับ
merge ใน pandas คือวิธีที่ผมใช้รวมสองตารางเข้าด้วยกันโดยจับคู่ตามคอลัมน์ที่กำหนด เหมือน VLOOKUP ใน Excel แต่ทรงพลังกว่ามากเพราะดึงได้ทุกคอลัมน์และรองรับ join หลายรูปแบบในคำสั่งเดียวครับ
numpy.where ผมใช้เลือกค่าจาก array ตามเงื่อนไขที่กำหนดครับ ถ้าให้เทียบง่ายๆ มันคือ IF ใน Excel นั่นแหละ แต่เก่งกว่าตรงที่ทำงานกับข้อมูลทั้ง array พร้อมกันในทีเดียว แถมยังใส่อาร์กิวเมนต์เดียวเพื่อหา index ที่ตรงเงื่อนไขได้อีกด้วย
query ใน pandas ผมใช้กรองแถวใน DataFrame ด้วยข้อความเงื่อนไขที่อ่านง่ายเหมือนพูดภาษาคน แทนที่จะเขียน boolean mask ยาวๆ ให้ตาลาย เหมาะมากกับเงื่อนไขซับซ้อนหลายข้อที่อยากให้โค้ดสั้นและอ่านรู้เรื่องครับ
ยังไม่มีบทความที่เกี่ยวข้องกับฟังก์ชันนี้
Comments
อีเมลของคุณจะไม่ถูกเผยแพร่