גלו את העוצמה של Pandas GroupBy לניתוח נתונים. מדריך זה בוחן טכניקות צבירה וטרנספורמציה עם דוגמאות מעשיות לנתונים בינלאומיים.
שליטה בפעולות GroupBy של Pandas: צבירה לעומת טרנספורמציה
Pandas, אבן הפינה של מניפולציה של נתונים בפייתון, מציעה כלי רב עוצמה לניתוח והבנת נתונים: פעולת GroupBy. תכונה זו מאפשרת לך לפלח את הנתונים שלך לקבוצות על סמך מאפיינים משותפים ולאחר מכן להחיל פונקציות על קבוצות אלה, ולחשוף תובנות שאחרת יישארו חבויות. מאמר זה מתעמק בשתי פעולות GroupBy מרכזיות: צבירה וטרנספורמציה, ומספק דוגמאות והסברים מעשיים המתאימים לאנשי מקצוע בתחום הנתונים ברחבי העולם.
הבנת קונספט ה-GroupBy
בבסיסה, GroupBy הוא תהליך הכולל שלושה שלבים עיקריים: פיצול הנתונים לקבוצות על סמך קריטריון אחד או יותר, החלת פונקציה על כל קבוצה באופן עצמאי, ושילוב התוצאות למבנה נתונים חדש. אסטרטגיית "פיצול-החלה-שילוב" זו היא קונספט בסיסי בניתוח נתונים ומספקת מסגרת גמישה לחקירת מערכי נתונים מורכבים.
העוצמה של GroupBy טמונה ביכולתו להתמודד עם סוגי ומבני נתונים שונים, מה שהופך אותו ליישים על פני תחומים מגוונים. בין אם אתה מנתח נתוני מכירות ממספר אזורים, קריאות חיישנים ממכשירים שונים או פעילות מדיה חברתית על פני דמוגרפיה, GroupBy יכול לעזור לך לחלץ תובנות משמעותיות.
צבירה: סיכום נתונים בתוך קבוצות
צבירה היא תהליך של חישוב סטטיסטיקות סיכום עבור כל קבוצה. סטטיסטיקות אלה מספקות סקירה תמציתית של מאפייני הקבוצה, ומאפשרות לך להשוות ולהנגיד פלחים שונים של הנתונים שלך. פונקציות צבירה נפוצות כוללות:
sum(): מחשב את סכום הערכים בתוך כל קבוצה.mean(): מחשב את הערך הממוצע בתוך כל קבוצה.median(): מחשב את הערך האמצעי בתוך כל קבוצה.min(): מוצא את הערך המינימלי בתוך כל קבוצה.max(): מוצא את הערך המקסימלי בתוך כל קבוצה.count(): סופר את מספר הערכים שאינם null בתוך כל קבוצה.size(): מחזיר את גודל כל קבוצה (כולל nulls).std(): מחשב את סטיית התקן בתוך כל קבוצה.var(): מחשב את השונות בתוך כל קבוצה.
דוגמאות מעשיות של צבירה
בואו ניקח מערך נתונים של נתוני מכירות בינלאומיים עבור חברת מסחר אלקטרוני היפותטית. הנתונים כוללים מידע על קטגוריית המוצר, מדינת המכירה וסכום המכירה.
import pandas as pd
# Sample data
data = {
'Category': ['Electronics', 'Clothing', 'Electronics', 'Clothing', 'Home Goods', 'Electronics', 'Clothing', 'Home Goods'],
'Country': ['USA', 'UK', 'Canada', 'USA', 'Germany', 'UK', 'Canada', 'Germany'],
'Sales': [100, 50, 75, 60, 80, 90, 45, 70]
}
df = pd.DataFrame(data)
print(df)
זה יפיק:
Category Country Sales
0 Electronics USA 100
1 Clothing UK 50
2 Electronics Canada 75
3 Clothing USA 60
4 Home Goods Germany 80
5 Electronics UK 90
6 Clothing Canada 45
7 Home Goods Germany 70
דוגמה 1: חישוב סך המכירות לכל קטגוריה
כדי לחשב את סך המכירות עבור כל קטגוריית מוצרים, אנו יכולים להשתמש בשיטת groupby() ואחריה פונקציית הצבירה sum().
category_sales = df.groupby('Category')['Sales'].sum()
print(category_sales)
זה יפיק:
Category
Clothing 155
Electronics 265
Home Goods 150
Name: Sales, dtype: int64
דוגמה 2: חישוב מכירות ממוצעות לכל מדינה
באופן דומה, כדי לחשב את המכירות הממוצעות לכל מדינה, אנו יכולים להשתמש בפונקציית הצבירה mean().
country_sales = df.groupby('Country')['Sales'].mean()
print(country_sales)
זה יפיק:
Country
Canada 60.0
Germany 75.0
UK 70.0
USA 80.0
Name: Sales, dtype: float64
דוגמה 3: שימוש בפונקציות צבירה מרובות
Pandas מאפשרת לך להחיל פונקציות צבירה מרובות בו זמנית באמצעות שיטת agg(). זה מספק סיכום מקיף של מאפייני הקבוצה.
category_summary = df.groupby('Category')['Sales'].agg(['sum', 'mean', 'median', 'count'])
print(category_summary)
זה יפיק:
sum mean median count
Category
Clothing 155 51.666667 50.0 3
Electronics 265 88.333333 90.0 3
Home Goods 150 75.000000 75.0 2
דוגמה 4: פונקציות צבירה מותאמות אישית
אתה יכול גם להגדיר פונקציות צבירה מותאמות אישית משלך באמצעות ביטויי lambda או פונקציות בעלות שם. זה מאפשר לך לחשב סטטיסטיקות ספציפיות שאינן זמינות בפונקציות הצבירה הסטנדרטיות.
# Custom function to calculate the range (max - min)
def custom_range(x):
return x.max() - x.min()
category_summary = df.groupby('Category')['Sales'].agg(['sum', 'mean', custom_range])
print(category_summary)
זה יפיק:
sum mean custom_range
Category
Clothing 155 51.666667 15
Electronics 265 88.333333 25
Home Goods 150 75.000000 10
טרנספורמציה: שינוי נתונים בתוך קבוצות
טרנספורמציה, לעומת זאת, כוללת שינוי הנתונים בתוך כל קבוצה על סמך חישוב כלשהו. שלא כמו צבירה, שמחזירה ערך מסוכם עבור כל קבוצה, טרנספורמציה מחזירה ערך עבור כל שורה בנתונים המקוריים, אך הערך מחושב על סמך הקבוצה שאליה שייכת שורה זו. פעולות טרנספורמציה שומרות על האינדקס המקורי והצורה של ה-DataFrame.
מקרים נפוצים לשימוש בטרנספורמציה כוללים:
- תקנון נתונים בתוך כל קבוצה.
- חישוב דירוג או אחוזון בתוך כל קבוצה.
- מילוי ערכים חסרים על סמך סטטיסטיקות קבוצתיות.
דוגמאות מעשיות של טרנספורמציה
בואו נמשיך עם נתוני המכירות הבינלאומיים שלנו. אנו יכולים להחיל טרנספורמציה כדי לבצע חישובים הקשורים לנתוני המכירות בתוך כל מדינה.
דוגמה 1: תקנון נתוני מכירות בתוך כל מדינה (Z-score)
תקנון נתונים כולל טרנספורמציה של הערכים כך שיהיה להם ממוצע של 0 וסטיית תקן של 1. זה שימושי להשוואת נתונים על פני סולמות והתפלגויות שונות. אנו יכולים להשתמש בשיטת transform() יחד עם ביטוי lambda כדי להשיג זאת.
from scipy.stats import zscore
df['Sales_Zscore'] = df.groupby('Country')['Sales'].transform(zscore)
print(df)
זה יפיק:
Category Country Sales Sales_Zscore
0 Electronics USA 100 1.000000
1 Clothing UK 50 -1.000000
2 Electronics Canada 75 1.000000
3 Clothing USA 60 -1.000000
4 Home Goods Germany 80 1.000000
5 Electronics UK 90 1.000000
6 Clothing Canada 45 -1.000000
7 Home Goods Germany 70 -1.000000
העמודה Sales_Zscore מכילה כעת את ערכי המכירות המתוקננים עבור כל מדינה. ערכים מעל 0 הם מעל המכירות הממוצעות עבור אותה מדינה, וערכים מתחת ל-0 הם מתחת לממוצע.
דוגמה 2: חישוב דירוג מכירות בתוך כל קטגוריה
כדי לחשב את הדירוג של כל מכירה בתוך הקטגוריה שלה, אנו יכולים להשתמש בשיטת rank() בתוך הפונקציה transform().
df['Sales_Rank'] = df.groupby('Category')['Sales'].transform(lambda x: x.rank(method='dense'))
print(df)
זה יפיק:
Category Country Sales Sales_Zscore Sales_Rank
0 Electronics USA 100 1.000000 3.0
1 Clothing UK 50 -1.000000 2.0
2 Electronics Canada 75 1.000000 1.0
3 Clothing USA 60 -1.000000 3.0
4 Home Goods Germany 80 1.000000 2.0
5 Electronics UK 90 1.000000 2.0
6 Clothing Canada 45 -1.000000 1.0
7 Home Goods Germany 70 -1.000000 1.0
העמודה Sales_Rank מציינת את הדירוג של כל מכירה בתוך הקטגוריה שלה. הארגומנט `method='dense'` מבטיח שדירוגים עוקבים מוקצים ללא פערים.
דוגמה 3: מילוי ערכים חסרים על סמך ממוצע קבוצתי
בואו נציג כמה ערכים חסרים בנתוני המכירות ולאחר מכן נמלא אותם על סמך המכירות הממוצעות עבור כל מדינה.
import numpy as np
# Introduce missing values
df.loc[[0, 3], 'Sales'] = np.nan
print(df)
# Fill missing values based on country mean
df['Sales_Filled'] = df['Sales'].fillna(df.groupby('Country')['Sales'].transform('mean'))
print(df)
ה-DataFrame הראשוני עם ערכים חסרים ייראה כך:
Category Country Sales Sales_Zscore Sales_Rank
0 Electronics USA NaN 1.000000 3.0
1 Clothing UK 50 -1.000000 2.0
2 Electronics Canada 75 1.000000 1.0
3 Clothing USA NaN -1.000000 3.0
4 Home Goods Germany 80 1.000000 2.0
5 Electronics UK 90 1.000000 2.0
6 Clothing Canada 45 -1.000000 1.0
7 Home Goods Germany 70 -1.000000 1.0
ואחרי מילוי הערכים החסרים:
Category Country Sales Sales_Zscore Sales_Rank Sales_Filled
0 Electronics USA NaN 1.000000 3.0 NaN
1 Clothing UK 50 -1.000000 2.0 50.0
2 Electronics Canada 75 1.000000 1.0 75.0
3 Clothing USA NaN -1.000000 3.0 NaN
4 Home Goods Germany 80 1.000000 2.0 80.0
5 Electronics UK 90 1.000000 2.0 90.0
6 Clothing Canada 45 -1.000000 1.0 45.0
7 Home Goods Germany 70 -1.000000 1.0 70.0
הערה חשובה: מכיוון שלא היה ממוצע קיים עבור `USA`, הערכים המתקבלים ב-`Sales_Filled` הם `NaN`. טיפול במקרי קצה כמו זה הוא חיוני לניתוח נתונים אמין ויש לקחת אותו בחשבון במהלך היישום.
צבירה לעומת טרנספורמציה: הבדלים עיקריים
בעוד שגם צבירה וגם טרנספורמציה הן פעולות GroupBy רבות עוצמה, הן משרתות מטרות שונות ויש להן מאפיינים מובחנים:
- צורת פלט: צבירה מצמצמת את גודל הנתונים, ומחזירה ערך בודד עבור כל קבוצה. טרנספורמציה שומרת על גודל הנתונים המקורי, ומחזירה ערך שעבר טרנספורמציה עבור כל שורה.
- מטרה: צבירה משמשת לסיכום נתונים ולקבלת תובנות לגבי מאפייני קבוצה. טרנספורמציה משמשת לשינוי נתונים בתוך קבוצות, לעתים קרובות לצורך תקנון או נרמול.
- ערך החזרה: צבירה מחזירה DataFrame או Series חדשים עם הערכים המצטברים. טרנספורמציה מחזירה Series עם הערכים שעברו טרנספורמציה, אשר ניתן לאחר מכן להוסיף כעמודה חדשה ל-DataFrame המקורי.
הבחירה בין צבירה לטרנספורמציה תלויה ביעדים האנליטיים הספציפיים שלך. אם אתה צריך לסכם נתונים ולהשוות קבוצות, צבירה היא הבחירה המתאימה. אם אתה צריך לשנות נתונים בתוך קבוצות תוך שמירה על מבנה הנתונים המקורי, טרנספורמציה היא האפשרות הטובה יותר.
טכניקות GroupBy מתקדמות
מעבר לצבירה וטרנספורמציה בסיסיות, Pandas GroupBy מציעה מגוון טכניקות מתקדמות לניתוח נתונים מתוחכם יותר.
החלת פונקציות מותאמות אישית עם apply()
שיטת apply() מספקת את הגמישות הגדולה ביותר, ומאפשרת לך להחיל כל פונקציה מותאמת אישית על כל קבוצה. פונקציה זו יכולה לבצע כל פעולה, כולל צבירה, טרנספורמציה או אפילו חישובים מורכבים יותר.
def custom_function(group):
# Calculate the sum of sales for each category in a group, only if there is more than one row in the group
if len(group) > 1:
group['Sales_Sum'] = group['Sales'].sum()
else:
group['Sales_Sum'] = 0 # Or some other default value
return group
df_applied = df.groupby('Country').apply(custom_function)
print(df_applied)
בדוגמה זו, אנו מגדירים פונקציה מותאמת אישית שמחשבת את סכום המכירות בתוך כל קבוצה (מדינה). שיטת apply() מחילה פונקציה זו על כל קבוצה, וכתוצאה מכך נוצרת עמודה חדשה המכילה את סכום המכירות עבור אותה קבוצה.
הערה חשובה: הפונקציה apply יכולה להיות אינטנסיבית יותר מבחינה חישובית מהשיטות האחרות. בצע אופטימיזציה של הקוד שלך ושקול יישומים חלופיים בעת עבודה עם מערכי נתונים עצומים.
קיבוץ לפי עמודות מרובות
אתה יכול לקבץ את הנתונים שלך לפי עמודות מרובות כדי ליצור פלחים גרעיניים יותר. זה מאפשר לך לנתח נתונים על סמך הצטלבות של מספר מאפיינים.
category_country_sales = df.groupby(['Category', 'Country'])['Sales'].sum()
print(category_country_sales)
זה יקבץ את הנתונים לפי Category וגם Country, ויאפשר לך לחשב את סך המכירות עבור כל קטגוריה בתוך כל מדינה. זה מספק תצוגה מפורטת יותר של ביצועי מכירות על פני אזורים שונים וקווי מוצרים.
איטרציה בין קבוצות
לניתוח מורכב יותר, אתה יכול לחזור על הקבוצות באמצעות לולאת for. זה מאפשר לך לגשת לכל קבוצה בנפרד ולבצע עליה פעולות מותאמות אישית.
for name, group in df.groupby('Category'):
print(f"Category: {name}")
print(group)
זה יחזור על כל קטגוריית מוצרים וידפיס את הנתונים המתאימים. זה יכול להיות שימושי לביצוע ניתוח מותאם אישית או ליצירת דוחות עבור כל קטגוריה.
שיטות עבודה מומלצות לשימוש ב-GroupBy
כדי להבטיח שימוש יעיל ואפקטיבי ב-GroupBy, שקול את שיטות העבודה המומלצות הבאות:
- הבן את הנתונים שלך: לפני החלת
GroupBy, הקדש זמן להבנת הנתונים שלך וזיהוי קריטריוני הקיבוץ הרלוונטיים ופונקציות הצבירה/טרנספורמציה. - בחר את הפעולה הנכונה: שקול בזהירות אם צבירה או טרנספורמציה היא הבחירה המתאימה ליעדים האנליטיים שלך.
- בצע אופטימיזציה לביצועים: עבור מערכי נתונים גדולים, שקול לבצע אופטימיזציה של הקוד שלך על ידי שימוש בפעולות וקטוריות והימנעות מלולאות מיותרות.
- טפל בערכים חסרים: היה מודע לערכים חסרים בנתונים שלך וטפל בהם כראוי באמצעות שיטות כמו
fillna()אוdropna(). - תעד את הקוד שלך: תעד בבירור את הקוד שלך כדי להסביר את המטרה של כל פעולת
GroupByואת ההיגיון מאחורי הבחירות שלך.
מסקנה
Pandas GroupBy הוא כלי רב עוצמה לניתוח נתונים, המאפשר לך לפלח את הנתונים שלך, להחיל פונקציות על כל קבוצה ולחלץ תובנות חשובות. על ידי שליטה בטכניקות צבירה וטרנספורמציה, אתה יכול לפתוח את מלוא הפוטנציאל של הנתונים שלך ולקבל הבנה מעמיקה יותר של הדפוסים והמגמות הבסיסיות. בין אם אתה מנתח נתוני מכירות, קריאות חיישנים או פעילות מדיה חברתית, GroupBy יכול לעזור לך לקבל החלטות מונחות נתונים ולהשיג את היעדים האנליטיים שלך. אמץ את הכוח של GroupBy והעלה את כישורי ניתוח הנתונים שלך לשלב הבא.
מדריך זה סיפק סקירה מקיפה של פעולות GroupBy של Pandas עם התמקדות בצבירה לעומת טרנספורמציה. באמצעות טכניקות אלה על נתונים בינלאומיים, מדעני נתונים ברחבי העולם מסוגלים לחלץ תובנות עסקיות חיוניות על פני מערכי נתונים מגוונים. תרגל, התנסה והתאם טכניקות אלה לצרכים הספציפיים שלך כדי למנף את מלוא הפוטנציאל של Pandas.