أساسيات GroupBy
قسّم البيانات إلى مجموعات واحسب الملخصات باستخدام نمط التقسيم-والتطبيق-والدمج مع groupby().
- فهم نمط التقسيم-والتطبيق-والدمج
- تجميع البيانات حسب عمود واحد أو أكثر باستخدام groupby()
- تطبيق عمليات التجميع مثل mean() و sum() و count() و describe()
- استخدام agg() لعمليات تجميع متعددة دفعة واحدة
نمط التقسيم-والتطبيق-والدمج
يعتبر GroupBy أحد أقوى ميزات pandas. يتبع نمطًا من ثلاث خطوات:
- التقسيم ، قسّم إطار البيانات إلى مجموعات بناءً على عمود واحد أو أكثر
- التطبيق ، احسب دالة على كل مجموعة بشكل مستقل
- الدمج ، ادمج النتائج مرة أخرى في إطار بيانات واحد
import pandas as pd
# titanic.csv ships with the course — load it from the browser file system.
df = pd.read_csv("titanic.csv")التجميع حسب عمود واحد
# Average survival rate by passenger class
print(df.groupby("Pclass")["Survived"].mean())المخرجات:
Pclass
1 0.629630
2 0.472826
3 0.242363
Name: Survived, dtype: float64
كان معدل نجاة ركاب الدرجة الأولى 63%، مقارنة بـ 24% للدرجة الثالثة. كشف groupby عن فجوة طبقية صارخة في ثوانٍ.
ما يحدث خطوة بخطوة:
# This is conceptually what groupby does:
for pclass, group_df in df.groupby("Pclass"):
print(f"Class {pclass}: {group_df['Survived'].mean():.3f}")التجميع حسب أعمدة متعددة
# Survival rate by class and sex
print(df.groupby(["Pclass", "Sex"])["Survived"].mean())المخرجات:
Pclass Sex
1 female 0.968085
male 0.368852
2 female 0.921053
male 0.157407
3 female 0.500000
male 0.135447
Name: Survived, dtype: float64
استخدم unstack() لجعل هذا أسهل قراءة:
print(df.groupby(["Pclass", "Sex"])["Survived"].mean().unstack())أساليب التجميع
يدعم GroupBy جميع عمليات التجميع القياسية:
# Mean fare by class
print(df.groupby("Pclass")["Fare"].mean())
# Total fare collected per class
print(df.groupby("Pclass")["Fare"].sum())
# Count of passengers per class
print(df.groupby("Pclass")["PassengerId"].count())عمليات تجميع متعددة باستخدام agg()
تطبق طريقة agg() دوال متعددة دفعة واحدة:
print(df.groupby("Pclass")["Fare"].agg(["mean", "median", "min", "max", "count"]))المخرجات:
mean median min max count
Pclass
1 84.154687 60.287 0.0000 512.3292 216
2 20.662183 19.575 0.0000 73.5000 184
3 13.675550 8.050 0.0000 56.4958 491
عمليات تجميع مختلفة لكل عمود:
print(df.groupby("Pclass").agg({
"Survived": "mean",
"Fare": ["mean", "max"],
"Age": "median",
"Name": "count"
}))تجميع جميع الأعمدة الرقمية
# Quick summary of all numeric columns per group
print(df.groupby("Pclass").mean(numeric_only=True))GroupBy مع الفلاتر
بعد التجميع، يمكنك تصفية مجموعات كاملة:
# Keep only groups with more than 50 passengers
large_groups = df.groupby("Pclass").filter(lambda x: len(x) > 50)
print(large_groups["Pclass"].value_counts())جرّب بنفسك
باستخدام مجموعة بيانات تيتانيك، احسب:
- متوسط الأجرة لكل ميناء إقلاع
- معدل النجاة لكل توليفة من الجنس وميناء الإقلاع
- إحصاءات العمر (المتوسط والوسيط والأدنى والأقصى) لكل درجة ركاب
import pandas as pd
# titanic.csv ships with the course — load it from the browser file system.
df = pd.read_csv("titanic.csv")
print("Average fare by port:")
print(df.groupby("Embarked")["Fare"].mean())
print("\nSurvival by sex and port:")
print(df.groupby(["Sex", "Embarked"])["Survived"].mean().unstack())
print("\nAge stats by class:")
print(df.groupby("Pclass")["Age"].agg(["mean", "median", "min", "max"]))خلاصات رئيسية
- يتبع GroupBy نمط التقسيم-والتطبيق-والدمج: قسّم البيانات، طبق دالة، ادمج النتائج
- جمّع بعمود واحد للملخصات البسيطة، وبأعمدة متعددة لتحليل أعمق
- يتيح لك
agg()حساب إحصاءات متعددة مرة واحدة، لكل عمود إذا لزم الأمر - يكشف GroupBy أنماطًا غير مرئية في البيانات الخام
تحدي التطبيق
من مجموعة بيانات تيتانيك، احسب معدل النجاة لكل توليفة من Pclass و Sex وما إذا كان الراكب يسافر بمفرده (SibSp + Parch == 0). أي مجموعة حققت أعلى معدل نجاة؟ وأيها الأدنى؟
1. ماذا يفعل df.groupby('col')؟
2. كيف تحسب متوسط كل مجموعة؟
3. ماذا يُرجع df.groupby('col').size()؟