Smart-World Surf

יחידה 8: מניפולציית נתונים עם Pandas

עבודה עם נתונים טבלאיים באמצעות DataFrames ו-Series.
SeriesDataFramesאינדקסים וסינוןמיזוג וקיבוץ נתונים

ברוכים הבאים ליחידה בנושא "מניפולציית נתונים עם Pandas"! יחידה זו היא אבן יסוד קריטית לכל מי שעוסק בניתוח נתונים בפייתון. ספריית Pandas מספקת מבני נתונים עוצמתיים וכלים קלים לשימוש לעבודה עם נתונים טבלאיים, והיא הכרחית להבנה, ניקוי, טרנספורמציה וניתוח של מערכי נתונים מורכבים. בשיעור זה נצלול לעומק המבנים המרכזיים שלה – Series ו-DataFrames – ונתמקד בטכניקות חיוניות לסינון, מיזוג וקיבוץ נתונים, תוך שימת דגש על עקרונות המפתח הנבחנים לרוב בקורסים כמו זה של דוידסון קולג'.

מבוא ל-Pandas: Series ו-DataFrames

Pandas היא ספריית קוד פתוח המספקת מבני נתונים בעלי ביצועים גבוהים וכלים לניתוח נתונים קלים לשימוש. היא נבנתה על גבי ספריית NumPy ומאפשרת עבודה אינטואיטיבית ויעילה עם נתונים טבלאיים, בדומה לגיליונות אלקטרוניים או מסדי נתונים יחסיים.

Series: מבנה נתונים חד-ממדי של Pandas, בדומה למערך (array) ב-NumPy, אך עם אינדקסים מתוויתים (labeled index). יכול להכיל כל סוג נתונים (מספרים שלמים, נקודה צפה, מחרוזות, אובייקטים).
DataFrame: מבנה נתונים דו-ממדי של Pandas, בדומה לטבלה במסד נתונים או גיליון אלקטרוני. מורכב מאוסף של אובייקטי Series החולקים אינדקס משותף, כאשר כל Series מייצג עמודה.

השוואה בין Series ל-DataFrame

Series

מבנה חד-ממדי. מתאים לייצוג עמודה בודדת של נתונים או רשימה עם תוויות. קל ליצור מליסטה, מערך NumPy או מילון. תומך בפעולות וקטוריות.

DataFrame

מבנה דו-ממדי. מתאים לייצוג טבלה שלמה עם שורות ועמודות. ניתן ליצור ממילון של Series, ממילון של ליסטות, או מקובץ (CSV, Excel). מאפשר ניתוח נתונים מורכב.

ניווט וסינון נתונים: אינדקסים ובחירה

אחת היכולות החזקות ביותר של Pandas היא הגישה הגמישה לנתונים באמצעות אינדקסים. לכל Series ו-DataFrame יש אינדקס שורות (row index) ו-DataFrame כולל גם אינדקס עמודות (column index). הבנה מעמיקה של אופן הגישה לנתונים היא קריטית ליעילות ולקוד נקי.

בחירת נתונים באמצעות אינדקסים

  • בחירה לפי תווית (Label-based selection): שימוש בתוויות השורות והעמודות.
  • בחירה לפי מיקום (Integer-location based selection): שימוש במיקום המספרי (אינדקס) של השורות והעמודות.
  • סינון בוליאני (Boolean indexing): יצירת מסכה בוליאנית לבחירת שורות העומדות בתנאי מסוים.
.loc: מאפיין המשמש לבחירת נתונים ב-DataFrame או Series על בסיס תוויות השורות והעמודות.
.iloc: מאפיין המשמש לבחירת נתונים ב-DataFrame או Series על בסיס מיקומם המספרי (אינדקסים שלמים) של השורות והעמודות.
.loc לעומת .iloc: זוהי נקודה קריטית הנבחנת לעיתים קרובות! ההבדל בין שימוש בתוויות למיקומים מספריים הוא מהותי. טעות נפוצה היא לנסות להשתמש ב-.loc עם אינדקסים מספריים או ב-.iloc עם תוויות. הבנה ברורה של מתי להשתמש בכל אחד מהם חיונית לכתיבת קוד יציב וצפוי, במיוחד כאשר האינדקסים אינם רציפים או ממוספרים מ-0.

שילוב וסיכום נתונים: מיזוג וקיבוץ

ניתוח נתונים מורכב לעיתים קרובות משילוב מידע ממקורות שונים וסיכום נתונים לפי קטגוריות. Pandas מספקת כלים חזקים לביצוע פעולות אלו ביעילות.

pd.merge(): פונקציה המשמשת לשילוב DataFrames על בסיס עמודות משותפות או אינדקסים, בדומה לפעולות JOIN במסדי נתונים יחסיים.

סוגי מיזוג עיקריים:

  • inner (ברירת מחדל): שומר רק שורות שיש להן התאמה בשני ה-DataFrames.
  • outer: שומר את כל השורות משני ה-DataFrames, וממלא ערכים חסרים ב-NaN.
  • left: שומר את כל השורות מה-DataFrame השמאלי, ומוסיף התאמות מהימני.
  • right: שומר את כל השורות מה-DataFrame הימני, ומוסיף התאמות מהשמאלי.
.groupby(): שיטה המשמשת לקיבוץ שורות ב-DataFrame על בסיס ערכים בעמודה או עמודות מסוימות, ולאחר מכן ביצוע פעולת אגרגציה (כגון סכום, ממוצע, ספירה) על כל קבוצה.

פעולות אגרגציה נפוצות לאחר groupby:

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

שאלות לדיון

  • הסבר את ההבדל המהותי בין Series ל-DataFrame ב-Pandas, ומתי תבחר להשתמש בכל אחד מהם. תן דוגמה קונספטואלית לכל אחד.
  • נתון DataFrame עם אינדקס שורות מותאם אישית (לדוגמה, שמות של ערים). הסבר כיצד תבחר שורה ספציפית באמצעות שמה, וכיצד תבחר את השורה החמישית (ללא קשר לשמה). מדוע חשוב להבחין בין שתי הגישות?
  • תיאור מצב: יש לך שני DataFrames, אחד עם פרטי לקוחות (ID, שם, עיר) והשני עם היסטוריית רכישות (ID לקוח, מוצר, כמות). תאר כיצד תשלב את הנתונים כדי לקבל רשימה של כל הלקוחות ורכישותיהם, כולל לקוחות שלא ביצעו רכישות. איזו פונקציה ואיזה סוג מיזוג תבחר?
  • כיצד תשתמש ב-.groupby() כדי למצוא את סך המכירות לכל מוצר מתוך ה-DataFrame המשולב מהשאלה הקודמת? כתוב את שלבי הפעולה.

נקודות לתשובת מודל

  • Series vs DataFrame: Series הוא חד-ממדי (עמודה בודדת עם אינדקס), מתאים לנתונים הומוגניים. DataFrame הוא דו-ממדי (טבלה עם שורות ועמודות, כל עמודה היא Series), מתאים לנתונים הטרוגניים. Series לנתונים פשוטים/עמודה, DataFrame לטבלאות מורכבות.
  • בחירה לפי אינדקס: לבחירת שורה לפי שמה (תווית), נשתמש ב-.loc['שם העיר']. לבחירת השורה החמישית (לפי מיקום), נשתמש ב-.iloc[4] (אינדקסים מתחילים מ-0). ההבחנה חיונית מכיוון שאינדקסים מתוויתים אינם בהכרח רציפים או מספריים, ושימוש שגוי יוביל לשגיאות או לתוצאות לא צפויות.
  • מיזוג DataFrames: נשתמש ב-pd.merge(df_לקוחות, df_רכישות, on='ID', how='left'). ה-on='ID' מציין את העמודה המשותפת למיזוג. ה-how='left' מבטיח שכל הלקוחות מ-df_לקוחות ייכללו, גם אם אין להם רכישות ב-df_רכישות (ערכי NaN יופיעו בעמודות הרכישות עבורם).
  • קיבוץ נתונים: כדי למצוא את סך המכירות לכל מוצר, נבצע: df_merged.groupby('מוצר')['כמות'].sum(). זה יקבץ את הנתונים לפי עמודת 'מוצר', ולאחר מכן יחשב את סכום עמודת 'כמות' עבור כל קבוצת מוצר.
מצאתם טעות או שחסר משהו?
→ הקודמת
מבוא לניתוח נתונים עם NumPy
הבאה ←
ניקוי ועיבוד מקדים של נתונים