التجميع groupby والجداول المحورية
لكل دولة، لكل جهاز، لكل يوم: كيف نحسب مقياسًا لكل شريحة دفعةً واحدة؟ ⏱ نحو 45 دقيقة.
- تجمّع البيانات حسب فئة بـ
groupby. - تجمّع بعدّة أعمدة ودوال بـ
agg. - تبني جداول متقاطعة بـ
pivot_table. - تختار بين العرض الطولي والمتقاطع.
١السؤال الأهمّ: لكل فئة، كم؟
أقوى سؤالٍ تحليليّ: «لكل دولة، ما إجمالي الإيراد؟»، «لكل جهاز، متوسط الطلبات؟». الجواب groupby: قسّم الصفوف إلى مجموعات حسب عمود، ثم احسب لكل مجموعة.
import pandas as pddf = pd.DataFrame({ "country": ["SA","EG","SA","SA","EG","AE"], "device": ["mobile","mobile","desktop","mobile","desktop","mobile"], "orders": [5, 2, 8, 3, 6, 4], "revenue": [300, 120, 800, 180, 420, 260],})# إجمالي الإيراد لكل دولةby_country = df.groupby("country")["revenue"].sum()print(by_country)print("---")# متوسط الطلبات لكل جهازprint(df.groupby("device")["orders"].mean())
النمط ثابت: groupby(عمود الفئة)[عمود القيمة].دالة(). الدالة قد تكون sum أو mean أو count أو max…
٢تجميع متعدّد ودوال متعدّدة
import pandas as pddf = pd.DataFrame({ "country": ["SA","EG","SA","SA","EG","AE"], "device": ["mobile","mobile","desktop","mobile","desktop","mobile"], "orders": [5, 2, 8, 3, 6, 4], "revenue": [300, 120, 800, 180, 420, 260],})# حسب دولة وجهاز معًاg = df.groupby(["country", "device"])["revenue"].sum()print(g)print("---")# عدّة دوال دفعة بـ aggprint(df.groupby("country")["revenue"].agg(["sum", "mean", "count"]))
التجميع بعمودين يعطي نتيجةً هرمية (دولة ← جهاز). وagg يحسب عدّة ملخّصات دفعةً واحدة.
٣الجدول المحوري pivot_table
حين نريد فئةً في الصفوف وأخرى في الأعمدة (كجدول متقاطع)، نستخدم pivot_table — الأشهر في تقارير لوحات التحكم:
import pandas as pddf = pd.DataFrame({ "country": ["SA","EG","SA","SA","EG","AE"], "device": ["mobile","mobile","desktop","mobile","desktop","mobile"], "orders": [5, 2, 8, 3, 6, 4], "revenue": [300, 120, 800, 180, 420, 260],})pt = df.pivot_table(index="country", columns="device", values="revenue", aggfunc="sum", fill_value=0)print(pt)
توقّع وتحقّق
لحساب مقياس لكل فئة:
النمط الصحيح:
لعدّة دوال دفعة بعد groupby:
لجدول متقاطع (فئة صفوف × فئة أعمدة):
الخلاصة
groupbyيقسّم الصفوف إلى مجموعات ويحسب لكلٍّ: النمطgroupby(فئة)[قيمة].دالة().- التجميع بعدّة أعمدة يعطي نتيجة هرمية، و
aggيحسب عدّة ملخّصات دفعة. pivot_tableيعرض فئةً في الصفوف وأخرى في الأعمدة كمصفوفة متقاطعة.- التجميع هو جوهر «ماذا تقول البيانات لكل شريحة» — أكثر ما تفعله في التحليل.
تحدٍّ برمجي: جمّع وحلّل
متوسطاطبع إجمالي الإيراد لكل دولة، ثم اسم الدولة الأعلى إيرادًا.
- جمّع الإيراد حسب
country. - اطبع إجمالي كل دولة، ثم اسم الأعلى.
ابدأ من هذا الكود، واضغط ▶ شغّل هنا لتكتب حلّك وتجرّبه مباشرة:
import pandas as pddf = pd.DataFrame({ "country": ["SA","EG","SA","SA","EG","AE"], "device": ["mobile","mobile","desktop","mobile","desktop","mobile"], "orders": [5, 2, 8, 3, 6, 4], "revenue": [300, 120, 800, 180, 420, 260],})# إجمالي الإيراد لكل دولة، ثم اسم الدولة الأعلى
💡 تلميح 1
df.groupby("country")["revenue"].sum().💡 تلميح 2
.idxmax() على النتيجة.حاول بنفسك أولًا؛ للمسألة أكثر من حلّ صحيح.
import pandas as pddf = pd.DataFrame({ "country": ["SA","EG","SA","SA","EG","AE"], "device": ["mobile","mobile","desktop","mobile","desktop","mobile"], "orders": [5, 2, 8, 3, 6, 4], "revenue": [300, 120, 800, 180, 420, 260],})by_country = df.groupby("country")["revenue"].sum()print(by_country)print(by_country.idxmax())