รูปแบบแยก-ประมวลผล-รวม
ทำความเข้าใจกระบวนการเชิงแนวคิดของ groupby ได้แก่ การแบ่ง DataFrame เป็นกลุ่ม การใช้ฟังก์ชัน และการรวมผลลัพธ์
รูปแบบแยก-ประมวลผล-รวม เป็นบทเรียน Pandas & NumPy Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Pandas & NumPy Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Pandas & NumPy Academy มีบทเรียนทั้งหมด 4 บทเรียน
GroupBy คืออะไร
การดำเนินการ GroupBy เป็นรูปแบบหนึ่งที่ทรงพลังที่สุดในการวิเคราะห์ข้อมูล โดยช่วยให้คุณแบ่ง DataFrame ออกเป็นกลุ่ม ใช้ฟังก์ชันกับแต่ละกลุ่มอย่างเป็นอิสระ แล้วรวมผลลัพธ์กลับเป็นโครงสร้างใหม่ กระบวนการนี้เรียกว่ารูปแบบ แบ่ง-ประมวลผล-รวม ซึ่งเป็นคำที่ Hadley Wickham นักสถิติเป็นผู้บัญญัติขึ้น
ขั้นตอนการแบ่ง
ในขั้นตอน แบ่ง Pandas จะแบ่ง DataFrame ออกเป็น DataFrame ย่อยตามค่าที่ไม่ซ้ำกันในคอลัมน์หนึ่งคอลัมน์หรือหลายคอลัมน์ ตัวอย่างเช่น หากข้อมูลของคุณมีคอลัมน์ region ที่มีค่าอย่าง 'North' 'South' และ 'West' ขั้นตอนการแบ่งจะสร้างกลุ่มแยกกันสามกลุ่ม ขณะนี้ยังไม่มีการย้ายหรือคัดลอกข้อมูล — Pandas เพียงบันทึกว่าแต่ละแถวอยู่ในกลุ่มใด
import pandas as pd
df = pd.DataFrame({
'region': ['North', 'South', 'North', 'West', 'South'],
'sales': [200, 150, 300, 180, 220]
})
# split: create a GroupBy object
grouped = df.groupby('region')
print(type(grouped)) # DataFrameGroupByขั้นตอนการประมวลผล
ในขั้นตอน ประมวลผล จะใช้ฟังก์ชันกับแต่ละกลุ่มอย่างเป็นอิสระ ฟังก์ชันนั้นอาจเป็นการรวมค่าที่มีมาให้แล้ว เช่น sum() หรือ mean() หรือเป็นฟังก์ชันแบบกำหนดเองที่คุณสร้างขึ้น แถวของแต่ละกลุ่มจะถูกส่งให้ฟังก์ชัน และฟังก์ชันจะคืนค่าเป็นสเกลาร์, Series หรือ DataFrame
# apply: compute the sum of 'sales' within each region group
total_sales = grouped['sales'].sum()
print(total_sales)
# region
# North 500
# South 370
# West 180
# Name: sales, dtype: int64ขั้นตอนการรวม
ในขั้นตอน รวม Pandas จะประกอบผลลัพธ์ของแต่ละกลุ่มกลับเป็นออบเจ็กต์เดียวโดยอัตโนมัติ ซึ่งโดยทั่วไปคือ Series หรือ DataFrame คีย์ของกลุ่มจะกลายเป็นดัชนีของผลลัพธ์ ขั้นตอนนี้เกิดขึ้นโดยที่คุณไม่ต้องเห็นรายละเอียด เมื่อคุณเรียกใช้เมธอดการรวมค่ากับออบเจ็กต์ GroupBy ทำให้ได้ตารางสรุปที่อ่านง่าย โดยมีหนึ่งแถวต่อหนึ่งกลุ่ม
# combine happens automatically — result is a Series indexed by 'region'
print(total_sales.index) # Index(['North', 'South', 'West'])
print(total_sales.values) # [500, 370, 180]การสร้างออบเจ็กต์ GroupBy
คุณสร้างออบเจ็กต์ GroupBy ได้โดยเรียกใช้ df.groupby(column) ในขั้นตอนนี้ยังไม่มีการคำนวณเกิดขึ้น เพราะออบเจ็กต์นี้เป็นแบบประเมินค่าเมื่อจำเป็น คุณสามารถวนซ้ำผ่านออบเจ็กต์เพื่อดูแต่ละกลุ่ม หรือเชื่อมเมธอดการรวมค่าเพื่อเริ่มการคำนวณ การส่ง as_index=False จะคงคอลัมน์ที่ใช้จัดกลุ่มไว้เป็นคอลัมน์ปกติ แทนที่จะใช้เป็นดัชนีในผลลัพธ์
grouped = df.groupby('region', as_index=False)
result = grouped['sales'].sum()
print(result)
# region sales
# 0 North 500
# 1 South 370
# 2 West 180การวนซ้ำผ่านกลุ่ม
คุณสามารถวนซ้ำผ่านออบเจ็กต์ GroupBy เพื่อตรวจสอบแต่ละกลุ่มแยกกันได้ ในการวนซ้ำแต่ละครั้งจะได้ทูเพิลของ (group_key, sub_dataframe) วิธีนี้มีประโยชน์สำหรับการแก้ไขข้อบกพร่อง หรือเมื่อต้องการประมวลผลแต่ละกลุ่มด้วยโค้ด Python ตามต้องการ อย่างไรก็ตาม ในการใช้งานจริงที่ต้องคำนึงถึงประสิทธิภาพ ควรเลือกใช้เมธอดการรวมค่าแบบเวกเตอร์แทนการวนซ้ำอย่างชัดเจน
for name, group in df.groupby('region'):
print(f'--- {name} ---')
print(group)
# --- North ---
# region sales
# 0 North 200
# 2 North 300
# --- South ---
# region sales
# 1 South 150
# 4 South 220ฟังก์ชันการรวมค่าที่ใช้บ่อย
Pandas GroupBy รองรับฟังก์ชันการรวมค่าที่มีมาให้แล้วหลายรายการ ได้แก่ sum(), mean(), count(), min(), max(), std(), median() และอื่น ๆ ฟังก์ชันเหล่านี้ได้รับการปรับประสิทธิภาพอย่างดี และทำงานกับทุกกลุ่มได้ภายในการประมวลผลครั้งเดียว ควรเลือกใช้ฟังก์ชันเหล่านี้แทนการเขียนฟังก์ชัน Python แบบกำหนดเองเสมอเมื่อมีฟังก์ชันที่ต้องการให้ใช้แล้ว
print(df.groupby('region')['sales'].mean())
# region
# North 250.0
# South 185.0
# West 180.0
print(df.groupby('region')['sales'].count())
# region
# North 2
# South 2
# West 1การจัดกลุ่มหลายคอลัมน์พร้อมกัน
คุณสามารถใช้การรวมค่ากับหลายคอลัมน์พร้อมกันได้ โดยเลือกคอลัมน์เหล่านั้นก่อนเรียกเมธอดการรวมค่า หรือไม่เลือกคอลัมน์เพื่อรวมค่าของคอลัมน์ตัวเลขทั้งหมด ผลลัพธ์จะเป็น DataFrame แทน Series โดยมีหนึ่งคอลัมน์ต่อหนึ่งตัวแปรที่นำมารวมค่า
df2 = pd.DataFrame({
'region': ['North', 'South', 'North', 'South'],
'units': [10, 8, 12, 9],
'revenue': [200, 160, 240, 180]
})
print(df2.groupby('region').sum())
# units revenue
# region
# North 22 440
# South 17 340แนวคิดเบื้องหลัง GroupBy
ให้คิดว่า GroupBy คล้ายกับคำสั่ง GROUP BY ของ SQL โค้ด Pandas df.groupby('region')['sales'].sum() เทียบเท่ากับ SELECT region, SUM(sales) FROM df GROUP BY region ใน SQL การเข้าใจความสอดคล้องนี้ช่วยให้คุณแปลงแนวทางระหว่างเครื่องมือทั้งสอง และเลือกแนวคิดที่เหมาะสมสำหรับกระบวนการประมวลผลของคุณ
# Pandas GroupBy is equivalent to SQL GROUP BY
# SQL: SELECT region, SUM(sales) FROM df GROUP BY region
# Pandas: df.groupby('region')['sales'].sum()
result = df.groupby('region')['sales'].sum().reset_index()
result.columns = ['region', 'total_sales']
print(result)เหตุใดจึงไม่ใช้ลูปแทน
คุณอาจสงสัยว่าเหตุใดจึงไม่วนซ้ำผ่านค่าที่ไม่ซ้ำกันแล้วคำนวณสถิติด้วยตนเอง คำตอบคือ ประสิทธิภาพและความอ่านง่าย การวนลูป Python ผ่านกลุ่มต่าง ๆ ช้ากว่าการเรียกใช้ groupby แบบเวกเตอร์เพียงครั้งเดียวมาก โดยเฉพาะกับชุดข้อมูลขนาดใหญ่ การดำเนินการ GroupBy ทำงานภายในโค้ด C ที่คอมไพล์แล้ว จึงเร็วกว่าลูป Python ที่ให้ผลเทียบเท่ากันประมาณ 10–100 เท่า
# Slow approach with a loop
results = {}
for region in df['region'].unique():
subset = df[df['region'] == region]
results[region] = subset['sales'].sum()
# Fast approach with GroupBy
results_fast = df.groupby('region')['sales'].sum().to_dict()
# Both give the same answer, but GroupBy is orders of magnitude fasterGroupBy ด้วยคีย์กลุ่มหลายรายการ
เมื่อต้องการรายละเอียดที่จำแนกย่อยมากขึ้น ให้จัดกลุ่มตามหลายคอลัมน์โดยส่งลิสต์ให้กับ groupby() ผลลัพธ์จะมี MultiIndex โดยแต่ละระดับสอดคล้องกับคอลัมน์ที่ใช้จัดกลุ่มหนึ่งคอลัมน์ ตัวอย่างเช่น การจัดกลุ่มตามทั้ง 'region' และ 'quarter' จะให้ยอดรวมของทุกคู่ภูมิภาคและไตรมาส
df3 = pd.DataFrame({
'region': ['North', 'North', 'South', 'South'],
'quarter': ['Q1', 'Q2', 'Q1', 'Q2'],
'sales': [200, 300, 150, 220]
})
print(df3.groupby(['region', 'quarter'])['sales'].sum())
# region quarter
# North Q1 200
# Q2 300
# South Q1 150
# Q2 220ตรวจสอบความเข้าใจ
ทดสอบความเข้าใจของคุณเกี่ยวกับรูปแบบแบ่ง-ประมวลผล-รวมจากบทเรียนนี้
สรุปบทเรียน
ในบทเรียนนี้ คุณได้เรียนรู้รูปแบบ แบ่ง-ประมวลผล-รวม ซึ่งเป็นพื้นฐานของการดำเนินการ GroupBy ทั้งหมด วิธีสร้าง ออบเจ็กต์ GroupBy ด้วย df.groupby() และวิธีใช้ การรวมค่าที่มีมาให้แล้ว เช่น sum() และ mean() เพื่อให้ได้ผลลัพธ์หนึ่งรายการต่อกลุ่ม บทถัดไปเราจะสำรวจการจัดกลุ่มด้วยคีย์เดียวและหลายคีย์ พร้อมเมธอดการรวมค่าเพิ่มเติม
คำถามที่พบบ่อย
บทเรียน “รูปแบบแยก-ประมวลผล-รวม” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “รูปแบบแยก-ประมวลผล-รวม” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Pandas & NumPy Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Pandas & NumPy Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “รูปแบบแยก-ประมวลผล-รวม”
ทำความเข้าใจกระบวนการเชิงแนวคิดของ groupby ได้แก่ การแบ่ง DataFrame เป็นกลุ่ม การใช้ฟังก์ชัน และการรวมผลลัพธ์ คุณปฏิบัติ Pandas & NumPy Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Pandas & NumPy Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Pandas & NumPy Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน
บทเรียน “รูปแบบแยก-ประมวลผล-รวม” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Pandas & NumPy Academy นี้ได้ไหม
ได้ บทเรียน Pandas & NumPy Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- รูปแบบแยก-ประมวลผล-รวม
- GroupBy ด้วยคีย์เดียวและหลายคีย์
- เมธอด agg()
- การแปลงและกรองด้วย GroupBy