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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- รูปแบบแยก-ประมวลผล-รวม
- GroupBy ด้วยคีย์เดียวและหลายคีย์
- เมธอด agg()
- การแปลงและกรองด้วย GroupBy