ברוכים הבאים ליחידה בנושא "מניפולציית נתונים עם Pandas"! יחידה זו היא אבן יסוד קריטית לכל מי שעוסק בניתוח נתונים בפייתון. ספריית Pandas מספקת מבני נתונים עוצמתיים וכלים קלים לשימוש לעבודה עם נתונים טבלאיים, והיא הכרחית להבנה, ניקוי, טרנספורמציה וניתוח של מערכי נתונים מורכבים. בשיעור זה נצלול לעומק המבנים המרכזיים שלה – Series ו-DataFrames – ונתמקד בטכניקות חיוניות לסינון, מיזוג וקיבוץ נתונים, תוך שימת דגש על עקרונות המפתח הנבחנים לרוב בקורסים כמו זה של דוידסון קולג'.
מבוא ל-Pandas: Series ו-DataFrames
Pandas היא ספריית קוד פתוח המספקת מבני נתונים בעלי ביצועים גבוהים וכלים לניתוח נתונים קלים לשימוש. היא נבנתה על גבי ספריית NumPy ומאפשרת עבודה אינטואיטיבית ויעילה עם נתונים טבלאיים, בדומה לגיליונות אלקטרוניים או מסדי נתונים יחסיים.
השוואה בין 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): יצירת מסכה בוליאנית לבחירת שורות העומדות בתנאי מסוים.
שילוב וסיכום נתונים: מיזוג וקיבוץ
ניתוח נתונים מורכב לעיתים קרובות משילוב מידע ממקורות שונים וסיכום נתונים לפי קטגוריות. Pandas מספקת כלים חזקים לביצוע פעולות אלו ביעילות.
סוגי מיזוג עיקריים:
- inner (ברירת מחדל): שומר רק שורות שיש להן התאמה בשני ה-DataFrames.
- outer: שומר את כל השורות משני ה-DataFrames, וממלא ערכים חסרים ב-NaN.
- left: שומר את כל השורות מה-DataFrame השמאלי, ומוסיף התאמות מהימני.
- right: שומר את כל השורות מה-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(). זה יקבץ את הנתונים לפי עמודת 'מוצר', ולאחר מכן יחשב את סכום עמודת 'כמות' עבור כל קבוצת מוצר.