0Pricing
Pandas & NumPy Academy · บทเรียน

รูปแบบแยก-ประมวลผล-รวม

ทำความเข้าใจกระบวนการเชิงแนวคิดของ 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 faster

GroupBy ด้วยคีย์กลุ่มหลายรายการ

เมื่อต้องการรายละเอียดที่จำแนกย่อยมากขึ้น ให้จัดกลุ่มตามหลายคอลัมน์โดยส่งลิสต์ให้กับ 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. รูปแบบแยก-ประมวลผล-รวม
  2. GroupBy ด้วยคีย์เดียวและหลายคีย์
  3. เมธอด agg()
  4. การแปลงและกรองด้วย GroupBy
← กลับไปที่ Pandas & NumPy Academy