ברוכים הבאים ליחידת הלימוד בנושא "טרנספורמציה ואיחוד נתונים ב-Pandas" בקורס 20606. יחידה זו היא אבן יסוד בעולם ניתוח הנתונים, שכן נתונים גולמיים לעיתים רחוקות מגיעים בצורה מושלמת. היכולת לנקות, לארגן, לשנות צורה ולאחד נתונים ממקורות שונים היא קריטית לכל פרויקט Data Science. שיעור זה יתמקד במושגים המרכזיים ובכלים המתקדמים של ספריית Pandas, תוך שימת דגש על היבטים החשובים לבחינה.
יסודות הטרנספורמציה ב-Pandas
טרנספורמציה של נתונים היא תהליך שינוי המבנה או התוכן של נתונים כדי להפוך אותם למתאימים יותר לניתוח. ב-Pandas, זה כרוך בשימוש במגוון פונקציות ושיטות על אובייקטי DataFrame ו-Series.
פעולות בסיסיות לטרנספורמציה:
- בחירה וסינון: בחירת עמודות ספציפיות, סינון שורות לפי תנאים.
- שינוי סוגי נתונים: המרת עמודות לסוג נתונים מתאים (לדוגמה, מסטרינג למספר או לתאריך) באמצעות
.astype(). - טיפול בערכים חסרים: מילוי ערכים חסרים (
.fillna()) או הסרת שורות/עמודות עם ערכים חסרים (.dropna()). - פעולות על מחרוזות ותאריכים: שימוש באקססורים
.strו-.dtלביצוע פעולות מורכבות על עמודות מסוג מחרוזת ותאריך/שעה, בהתאמה.
פעולות טרנספורמציה מתקדמות
Pandas מציעה כלים חזקים לביצוע טרנספורמציות מורכבות, החיוניות לניתוח נתונים מעמיק.
קיבוץ וצבירה (Groupby and Aggregation):
השיטה .groupby() היא אחת החזקות ב-Pandas. ניתן להשתמש בה עם:
.agg(): לביצוע פונקציות צבירה שונות (sum, mean, count, min, max) על כל קבוצה..transform(): לביצוע טרנספורמציה על כל קבוצה והחזרת Series באותו גודל כמו ה-DataFrame המקורי, כאשר הערכים מותאמים לקבוצה אליה הם שייכים. זה שימושי להוספת מידע מצטבר (כמו ממוצע קבוצתי) חזרה ל-DataFrame המקורי..filter(): לסינון קבוצות שלמות על בסיס תנאי מסוים.
יישום פונקציות מותאמות אישית:
לפעמים, פעולות וקטוריות אינן מספיקות, ויש צורך להפעיל פונקציה מותאמת אישית. Pandas מספקת מספר דרכים לעשות זאת:
DataFrame.apply()
מפעיל פונקציה לאורך ציר (שורות או עמודות) של DataFrame. שימושי לפעולות מורכבות הדורשות גישה למספר עמודות בשורה אחת, או לשורות מרובות בעמודה אחת.
Series.map()
מפעיל פונקציה על כל אלמנט ב-Series. שימושי למיפוי ערכים מ-Series אחד לערכים אחרים (לדוגמה, החלפת קודים בשמות מלאים) או לטרנספורמציה אלמנטרית.
DataFrame.applymap()
מפעיל פונקציה על כל אלמנט ב-DataFrame. שימושי לטרנספורמציות אלמנטריות שצריכות לחול על כל התאים ב-DataFrame, ללא תלות בעמודה או בשורה.
שינוי צורה (Reshaping):
.pivot_table(): מאפשר לסובב (pivot) DataFrame, ליצור טבלה חדשה עם עמודות, אינדקסים וערכים מוגדרים, ולבצע צבירה על הנתונים..melt(): ההפך מ-pivot. משנה DataFrame מ"רחב" ל"ארוך", על ידי הפיכת עמודות למשתנים..stack()/.unstack(): משנים את מבנה האינדקסים (multi-index) והעמודות, שימושיים לעבודה עם נתונים היררכיים.
איחוד נתונים ממקורות שונים
לעיתים קרובות, נתונים מגיעים ממספר קבצים או טבלאות, ויש צורך לאחד אותם ל-DataFrame אחד לניתוח כולל.
pd.merge()
כלי רב עוצמה לשילוב DataFrames על בסיס עמודות משותפות (מפתחות). מאפשר סוגי איחוד שונים (how): 'inner' (ברירת מחדל, רק שורות עם מפתחות תואמים בשני ה-DataFrames), 'left', 'right', 'outer' (כל השורות משני ה-DataFrames).
pd.concat()
משמש לשרשור (stacking) של DataFrames זה מתחת לזה (axis=0, ברירת מחדל) או זה לצד זה (axis=1). אינו דורש מפתחות משותפים, אלא מחבר את ה-DataFrames כפי שהם. שימושי לשילוב קבצים עם מבנה זהה.
DataFrame.join()
שיטה של DataFrame שמהווה עטיפה נוחה ל-pd.merge(), כאשר האיחוד מתבצע בדרך כלל על בסיס האינדקסים של ה-DataFrames.
שיקולי ביצועים וטעויות נפוצות
אחת הטעויות הנפוצות ב-Pandas היא שימוש יתר ב-.apply() כאשר קיימת חלופה וקטורית יעילה יותר. פעולות וקטוריות (כמו חיבור עמודות, שימוש ב-.str, .dt, או פונקציות NumPy) ממומשות בשפות ברמה נמוכה (C/Cython) ולכן מהירות באופן משמעותי, במיוחד על DataFrames גדולים. בבחינה, ייתכן שתתבקשו לבחור את הדרך היעילה ביותר לביצוע משימה, או להסביר מדוע פתרון מסוים עדיף מבחינת ביצועים. תמיד שאפו לפתרונות וקטוריים לפני שאתם פונים ל-.apply().
טעויות נפוצות באיחוד נתונים:
- מפתחות לא תואמים: איחוד על עמודות עם שמות שונים או סוגי נתונים שונים יגרום לתוצאות לא צפויות (לדוגמה, DataFrame ריק או ערכי NaN רבים).
- מפתחות כפולים: אם יש מפתחות כפולים באחד או בשני ה-DataFrames, ה-DataFrame המאוחד יכול להיות גדול בהרבה מהצפוי.
- אי הבנה של סוגי ה-
howב-merge: בחירה לא נכונה של'inner','left','right'או'outer'יכולה להוביל לאובדן נתונים או לכלול נתונים לא רצויים.
שאלות לדיון
- מתי תעדיפו להשתמש ב-
pd.merge()ומתי ב-pd.concat()? תנו דוגמה לתרחיש לכל אחד. - הסבירו את ההבדל בין
DataFrame.apply(),Series.map()ו-DataFrame.applymap(). מתי כל אחד מהם מתאים ביותר? - יש לכם DataFrame עם נתוני מכירות, הכולל עמודת 'קטגוריית מוצר'. כיצד הייתם מחשבים את המכירה הממוצעת לכל קטגוריה, ולאחר מכן מוסיפים את הממוצע הזה כעמודה חדשה ל-DataFrame המקורי, כך שכל שורה תציג את הממוצע של הקטגוריה שלה?
- תארו תרחיש שבו
pivot_tableיהיה שימושי לניתוח נתונים. מהם הפרמטרים העיקריים שלו?
נקודות לתשובת מודל
pd.merge()משמש לאיחוד על בסיס עמודות משותפות/מפתחות;pd.concat()משמש לשרשור (הוספה) של DataFrames לאורך ציר מסוים (שורות או עמודות).DataFrame.apply()פועל על שורות/עמודות של DataFrame;Series.map()פועל על אלמנטים של Series;DataFrame.applymap()פועל על כל אלמנט ב-DataFrame.- לחישוב ממוצע קטגוריה והוספתו ל-DataFrame המקורי, יש להשתמש ב-
df.groupby('קטגוריית מוצר')['מכירות'].transform('mean'). pivot_tableשימושי לשינוי צורה וצבירת נתונים, לדוגמה, יצירת טבלת סיכום של מכירות לפי קטגוריה וחודש. פרמטרים עיקריים:index,columns,values,aggfunc.- יש להעדיף פעולות וקטוריות על פני
.apply()בגלל ביצועים עדיפים משמעותית.