שימו לב: על מנת להריץ את התאים ב-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
רמז
השתמשו בidxmin.
לחצו כאן כדי לצפות בפתרון
באמצעות groupby וidxmin נוכל לחלץ את שם השורה של הסטודנט שקיבל את הציון הכי נמוך בכל תואר.
לאחר מכן, באמצעות loc, נוכל לקבל את השמות שנמצאים באותן השורות, כדי לקבל את שמות הסטודנטים.
df.loc[df.groupby(["Degree"])['Programming'].idxmin(), 'Name']