groupby - סיכום קבוצות של שורות לכדי שורה בודדת

שימו לב: על מנת להריץ את התאים ב-Live Code, יש לייבא תחילה את ספרית pandas ע”י הרצת השורת הראשונה בתא למטה.
בנוסף, נגביל את מספר השורות והעמודות שתופענה בהדפסת הטבלאות ע”י שורות הקוד השניה והשלישית:

import pandas as pd
pd.options.display.max_rows=5
pd.options.display.max_columns=5

בפרק זה נתחיל להכיר את אחת מהיכולות החזקות ביותר של pandas: קיבוץ נתונים לפי קטגוריות או תכונות משותפות, באמצעות המתודה groupby. פונקציה זו מאפשרת לנו לבצע חישובים סטטיסטיים, סיכומים וטרנספורמציות שונות עבור תת-קבוצות של הנתונים, מבלי לכתוב לולאות מסובכות. נלמד כיצד לקבץ טבלאות לפי ערך בעמודה, לבצע פעולות כמו סכום, ממוצע ומניין על כל קבוצה.

groupby - סיכום קבוצות של שורות לכדי שורה בודדת#

המתודה groupby מאפשרת לבצע שאילתות מתקדמות באמצעות חלוקת הנתונים לקבוצות על פי ערכים בעמודה מסוימת (או במספר עמודות), ולאחר מכן להפעיל על כל קבוצה חישובים ופעולות סיכום.

לדוגמא, נניח כי בטבלת ציוני הסטודנטים שלנו קיימת עמודה נוספת בשם Degree המייצגת את התואר אותו לומד כל סטודנט. נוכל להשתמש ב־groupby("Degree") כדי לאסוף את כל הסטודנטים של כל תואר לקבוצה אחת, ואז לחשב ממוצע ציונים בכל קורס לכל תואר בנפרד.

כדי לממש את התרחיש לעיל, נוסיף לטבלה שלנו עמודה חדשה בשם “Degree”

inputFileName = "files/StudentsGrades.csv"
df = pd.read_csv(inputFileName)
df['Degree']=["Industrial", "Industrial", "mechanical", \
              "Industrial", "Industrial", "electrical", \
              "electrical", "electrical", "electrical", \
              "bio-medical", "bio-medical", "mechanical", "mechanical"]
display(df)
Name Programming ... Art Degree
0 Yael 50 ... 91 Industrial
1 Nadav 61 ... 88 Industrial
... ... ... ... ... ...
11 Tom 98 ... 80 mechanical
12 Adi 76 ... 70 mechanical

13 rows × 9 columns

התחביר של groupby#

()df.groupby(x)[y].op#

  • חלוקת ה־DataFrame לקבוצות (טבלאות משנה מסוג DataFrame) לפי הערכים בעמודה או בעמודות x

  • בחירת העמודה או העמודות עליהן נרצה לבצע את סיכום הערכים - y

  • ביצוע פעולת סיכום על הערכים של כל קבוצה בנפרד, באמצעות האופרטור/פונקציה המתאימה (op). למשל: mean, max, min, sum, count, apply

שימו לב ש־x ו־y יכולים להיות עמודה אחת (מחרוזת בודדת str) או מספר עמודות (רשימה של מחרוזות).

לדוגמא, השורה שלהלן מחזירה את הממוצע בקורס תכנות בפילוח לפי סוג תואר:

df.groupby(["Degree"])['Programming'].mean()
Degree
Industrial     57.25
bio-medical    85.00
electrical     78.25
mechanical     85.00
Name: Programming, dtype: float64

כלומר במקרה זה:

  • x היה “Degree”.

  • y היה “Programming”.

  • op היה mean.

ואם נרצה לדעת מהו הציון המקסימלי שהתקבל בכל קבוצה?
פשוט נחליף את פעולת הסיכום לmax:

df.groupby(["Degree"])['Programming'].max()
Degree
Industrial      82
bio-medical    100
electrical      95
mechanical      98
Name: Programming, dtype: int64

תרגול#

כתבו שורת קוד בודדת המחלצת את שם הסטודנט שקיבל את הציון הכי נמוך בכל תואר (סה”כ 4 סטודנטים כי ישנם 4 תארים).
הניחו כי בכל תואר קיים סטודנט אחד כזה בדיוק.

# Write your code here