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

GroupBy ด้วยคีย์เดียวและหลายคีย์

จัดกลุ่มตามคอลัมน์หนึ่งคอลัมน์หรือหลายคอลัมน์ด้วย groupby() และใช้การรวมค่าแบบ sum, mean, count และ min/max

GroupBy ด้วยคีย์เดียวและหลายคีย์ เป็นบทเรียน Pandas & NumPy Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Pandas & NumPy Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Pandas & NumPy Academy มีบทเรียนทั้งหมด 4 บทเรียน

GroupBy ด้วยคีย์เดียว

การเรียกใช้ GroupBy ที่ง่ายที่สุดคือการใช้คอลัมน์เดียวเป็นคีย์สำหรับจัดกลุ่ม คุณเรียกใช้ df.groupby('column_name') แล้วเชื่อมต่อด้วยการรวมค่า Pandas จะสร้างหนึ่งกลุ่มสำหรับแต่ละค่าที่ไม่ซ้ำกันในคอลัมน์นั้น และใช้การรวมค่ากับทุกคอลัมน์ตัวเลข หรือคอลัมน์ที่เลือกไว้ นี่คือรูปแบบ GroupBy ที่ใช้บ่อยที่สุดในการวิเคราะห์ข้อมูลแต่ละวัน

import pandas as pd

df = pd.DataFrame({
    'dept': ['Eng', 'HR', 'Eng', 'HR', 'Eng'],
    'salary': [90000, 60000, 95000, 62000, 88000],
    'years': [3, 5, 7, 2, 4]
})

print(df.groupby('dept')['salary'].mean())
# dept
# Eng    91000.0
# HR     61000.0

การเลือกคอลัมน์ที่จะรวมค่า

หลังจากเรียกใช้ groupby() คุณสามารถเลือกคอลัมน์เดียวด้วยรูปแบบวงเล็บเหลี่ยมเพื่อให้ได้ SeriesGroupBy หรือเลือกหลายคอลัมน์ด้วยลิสต์เพื่อให้ได้ DataFrameGroupBy หากไม่เลือกคอลัมน์เลย Pandas จะรวมค่าของคอลัมน์ตัวเลขทั้งหมด ซึ่งสะดวก แต่อาจให้ผลลัพธ์ที่ไม่คาดคิดเมื่อมีคอลัมน์ตัวเลขที่ไม่เกี่ยวข้อง

# Single column result -> SeriesGroupBy
print(df.groupby('dept')['salary'].sum())

# Multiple columns result -> DataFrameGroupBy
print(df.groupby('dept')[['salary', 'years']].mean())
#        salary  years
# dept
# Eng   91000.0    4.667
# HR    61000.0    3.500

การรวมค่าที่ใช้บ่อยทั้งหมด

Pandas รองรับเมธอดการรวมค่าที่มีมาให้แล้วครบชุดสำหรับออบเจ็กต์ GroupBy ได้แก่ sum(), mean(), median(), min(), max(), count(), std(), var(), first() และ last() แต่ละเมธอดจะคืนค่าสเกลาร์ต่อกลุ่ม ทำให้ได้ตารางสรุปที่อ่านง่ายและมีคีย์การจัดกลุ่มเป็นดัชนี

g = df.groupby('dept')['salary']
print('sum:   ', g.sum())
print('mean:  ', g.mean())
print('min:   ', g.min())
print('max:   ', g.max())
print('count: ', g.count())
print('std:   ', g.std().round(2))

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

ส่ง ลิสต์ชื่อคอลัมน์ ให้กับ groupby() เพื่อจัดกลุ่มตามมิติมากกว่าหนึ่งมิติพร้อมกัน ชุดค่าที่ไม่ซ้ำกันในคอลัมน์เหล่านั้นแต่ละชุดจะกลายเป็นกลุ่มของตนเอง ผลลัพธ์จะมี MultiIndex หนึ่งระดับต่อหนึ่งคอลัมน์ที่ใช้จัดกลุ่ม ทำให้คุณเจาะดูสรุปข้อมูลข้ามมิติได้ในขั้นตอนเดียว

df2 = pd.DataFrame({
    'dept':   ['Eng', 'Eng', 'HR',  'HR',  'Eng', 'HR'],
    'level':  ['L1',  'L2',  'L1',  'L2',  'L1',  'L1'],
    'salary': [80000, 100000, 55000, 70000, 82000, 58000]
})

result = df2.groupby(['dept', 'level'])['salary'].mean()
print(result)
# dept  level
# Eng   L1       81000.0
#       L2      100000.0
# HR    L1       56500.0
#       L2       70000.0

การเข้าถึงผลลัพธ์แบบ MultiIndex

เมื่อจัดกลุ่มด้วยคีย์หลายรายการ ดัชนีของผลลัพธ์จะเป็น MultiIndex คุณสามารถเข้าถึงระดับนอกที่ต้องการด้วย .loc['value'] และนำทางไปยังระดับด้านในด้วยทูเพิล การเรียกใช้ reset_index() จะทำให้ MultiIndex กลับเป็นคอลัมน์ปกติ ซึ่งมักสะดวกกว่าสำหรับการดำเนินการเพิ่มเติมหรือการส่งออกข้อมูล

result = df2.groupby(['dept', 'level'])['salary'].mean()

# Access Engineering rows only
print(result.loc['Eng'])
# level
# L1     81000.0
# L2    100000.0

# Flatten to a regular DataFrame
print(result.reset_index())
#   dept level    salary
# 0  Eng    L1   81000.0
# 1  Eng    L2  100000.0

การใช้ as_index=False

โดยค่าเริ่มต้น คอลัมน์ที่ใช้จัดกลุ่มจะกลายเป็นดัชนีของผลลัพธ์ การส่ง as_index=False จะคงคอลัมน์เหล่านั้นไว้เป็นคอลัมน์ปกติแทน ทำให้ได้ DataFrame แบบแบนที่ส่งต่อให้การดำเนินการของ Pandas หรือส่งออกได้ง่ายขึ้น ซึ่งเทียบเท่ากับการเรียกใช้ reset_index() กับผลลัพธ์

flat = df2.groupby(['dept', 'level'], as_index=False)['salary'].mean()
print(flat)
#   dept level    salary
# 0  Eng    L1   81000.0
# 1  Eng    L2  100000.0
# 2   HR    L1   56500.0
# 3   HR    L2   70000.0

การนับแถวในแต่ละกลุ่ม

count() จะคืนจำนวนค่าที่ ไม่เป็นค่าว่าง ในแต่ละกลุ่ม หากต้องการจำนวนแถวทั้งหมดในแต่ละกลุ่มโดยไม่คำนึงถึงค่าว่าง ให้ใช้ size() แทน ความแตกต่างนี้สำคัญเมื่อข้อมูลมีค่าที่หายไป เพราะ count() จะนับจำนวนของกลุ่มที่มีรายการ NaN ต่ำกว่าความเป็นจริง

import numpy as np

df3 = pd.DataFrame({
    'dept': ['Eng', 'Eng', 'HR', 'HR'],
    'bonus': [5000, np.nan, 3000, 4000]
})

print(df3.groupby('dept')['bonus'].count())  # ignores NaN
# dept
# Eng    1
# HR     2

print(df3.groupby('dept')['bonus'].size())   # includes NaN rows
# dept
# Eng    2
# HR     2

การเรียงลำดับผลลัพธ์ของ GroupBy

โดยค่าเริ่มต้น GroupBy จะเรียงลำดับผลลัพธ์ตามคีย์ของกลุ่ม คุณสามารถปิดการเรียงลำดับด้วย sort=False เพื่อคงลำดับที่ปรากฏครั้งแรกในข้อมูลเดิม ซึ่งจะทำงานเร็วขึ้นเล็กน้อยกับชุดข้อมูลขนาดใหญ่ เมื่อได้ผลลัพธ์เป็น DataFrame แล้ว คุณสามารถเรียงลำดับเพิ่มเติมด้วย sort_values() ตามคอลัมน์ใดก็ได้

result = (df.groupby('dept', sort=False)['salary']
            .mean()
            .reset_index()
            .sort_values('salary', ascending=False))
print(result)
#   dept    salary
# 0  Eng   91000.0
# 1   HR   61000.0

การเชื่อม GroupBy กับเมธอดอื่น

ผลลัพธ์ของ GroupBy เป็น Series หรือ DataFrame ปกติ ดังนั้นคุณจึงสามารถเชื่อมเมธอดของ Pandas เพิ่มเติมได้ทันที รูปแบบที่ใช้บ่อยคือ รวมค่า จากนั้นใช้ reset_index() แล้วเปลี่ยนชื่อคอลัมน์ และใช้ sort_values() ต่อ ทั้งหมดนี้ทำได้ในสายการเรียกเมธอดเดียวที่อ่านง่าย โดยไม่ต้องเก็บตัวแปรระหว่างทาง

summary = (
    df
    .groupby('dept')['salary']
    .agg(['mean', 'count'])
    .rename(columns={'mean': 'avg_salary', 'count': 'headcount'})
    .reset_index()
    .sort_values('avg_salary', ascending=False)
)
print(summary)

การใช้ sum, mean และ count พร้อมกัน

บ่อยครั้งคุณต้องการสถิติมากกว่าหนึ่งรายการต่อกลุ่ม ให้ส่งลิสต์ชื่อฟังก์ชันให้กับ .agg() เพื่อคำนวณหลายรายการพร้อมกัน ผลลัพธ์จะเป็น DataFrame ที่มีหนึ่งคอลัมน์ต่อหนึ่งฟังก์ชัน วิธีนี้มีประสิทธิภาพมากกว่าการเรียกใช้การรวมค่าแต่ละรายการแยกกัน เพราะ Pandas ประมวลผลทั้งหมดภายในการอ่านข้อมูลเพียงครั้งเดียว

result = df.groupby('dept')['salary'].agg(['sum', 'mean', 'count', 'max'])
print(result)
#           sum      mean  count    max
# dept
# Eng    273000   91000.0      3  95000
# HR     122000   61000.0      2  62000

การจัดกลุ่มตามคอลัมน์ประเภทจัดหมวดหมู่

เมื่อคอลัมน์ที่ใช้จัดกลุ่มมีชนิดข้อมูล Categorical Pandas จะใส่หมวดหมู่ทั้งหมดไว้ในผลลัพธ์โดยค่าเริ่มต้น แม้หมวดหมู่เหล่านั้นจะไม่มีแถวข้อมูลก็ตาม วิธีนี้มีประโยชน์เมื่อต้องการให้ตารางสรุปแสดงทุกหมวดหมู่เสมอ แต่จะสร้างแถวที่มีค่า NaN หรือ 0 สำหรับกลุ่มว่าง คุณควบคุมพฤติกรรมนี้ได้ด้วยพารามิเตอร์ observed โดยตั้งค่าเป็น True เพื่อข้ามหมวดหมู่ที่ว่าง

df['dept'] = df['dept'].astype('category')
# With observed=True, only groups that appear in data are included
print(df.groupby('dept', observed=True)['salary'].mean())
# dept
# Eng    91000.0
# HR     61000.0

ตรวจสอบความเข้าใจ

ทดสอบความเข้าใจของคุณเกี่ยวกับ GroupBy ด้วยคีย์เดียวและหลายคีย์จากบทเรียนนี้

สรุปบทเรียน

ในบทเรียนนี้ คุณได้เรียนรู้วิธีจัดกลุ่มตาม คอลัมน์เดียว และใช้การรวมค่าที่พบบ่อย วิธีจัดกลุ่มตาม หลายคอลัมน์ เพื่อสร้างสรุปข้อมูลข้ามมิติ และความแตกต่างระหว่าง count() กับ size() เมื่อมีค่าว่าง บทถัดไปเราจะสำรวจเมธอด agg() ที่ทรงพลังสำหรับคำนวณสถิติหลายประเภทภายในการเรียกใช้ครั้งเดียว

คำถามที่พบบ่อย

บทเรียน “GroupBy ด้วยคีย์เดียวและหลายคีย์” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “GroupBy ด้วยคีย์เดียวและหลายคีย์” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Pandas & NumPy Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Pandas & NumPy Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “GroupBy ด้วยคีย์เดียวและหลายคีย์”

จัดกลุ่มตามคอลัมน์หนึ่งคอลัมน์หรือหลายคอลัมน์ด้วย groupby() และใช้การรวมค่าแบบ sum, mean, count และ min/max คุณปฏิบัติ Pandas & NumPy Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Pandas & NumPy Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Pandas & NumPy Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน

บทเรียน “GroupBy ด้วยคีย์เดียวและหลายคีย์” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Pandas & NumPy Academy นี้ได้ไหม

ได้ บทเรียน Pandas & NumPy Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

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

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