أسلوب agg()
طبّق عدة دوال تجميع في آن واحد باستخدام agg()، ومرّر قاموسًا لحساب إحصاءات مختلفة لأعمدة مختلفة.
أسلوب agg() درس مجاني في Pandas & NumPy Academy على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Pandas & NumPy Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Pandas & NumPy Academy 4 دروس في المجموع.
لماذا نستخدم agg()؟
يمنحكم استدعاء sum() أو mean() مباشرةً على كائن GroupBy إحصاءً واحدًا. لكن التحليلات الواقعية تحتاج غالبًا إلى عدة إحصاءات في آن واحد، مثل إجمالي الإيرادات ومتوسط حجم الطلب وعدد الطلبات لكل منطقة. وتتيح لكم طريقة agg()، وهي اختصار لـ aggregate، حساب كل هذه القيم في استدعاء واحد فعال بدلًا من تشغيل عمليات تجميع منفصلة ودمج نتائجها.
تمرير قائمة بأسماء الدوال
أبسط استخدام لـ agg() هو تمرير قائمة من السلاسل النصية التي تمثل أسماء الدوال. يطبق Pandas كل دالة على العمود المحدد، ويُرجع DataFrame بحيث يقابل كل عمود دالة واحدة. ويعمل هذا الأسلوب مع أي اسم من أسماء عمليات التجميع المضمّنة، مثل: 'sum' و'mean' و'min' و'max' و'count' و'std' و'median' وغيرها.
import pandas as pd
df = pd.DataFrame({
'region': ['East', 'West', 'East', 'West', 'East', 'West'],
'revenue': [200, 340, 150, 290, 310, 410],
'units': [20, 35, 15, 30, 28, 40]
})
result = df.groupby('region')['revenue'].agg(['sum', 'mean', 'count', 'max'])
print(result)
# sum mean count max
# region
# East 660 220.000000 3 310
# West 1040 346.666667 3 410إعادة تسمية أعمدة الناتج باستخدام عمليات التجميع المسماة
عند تمرير قائمة من السلاسل النصية، تُسمّى أعمدة الناتج بأسماء الدوال نفسها، مثل 'sum' و'mean' وغيرهما. وللحصول على ناتج أوضح، استخدموا عمليات التجميع المسماة، وذلك بتمرير وسائط كلمات مفتاحية يكون المفتاح فيها هو اسم العمود المطلوب، وتكون القيمة صفيفًا من الشكل (column, function). وهذا هو الأسلوب الحديث في Pandas، كما أنه ينتج شيفرة تشرح نفسها.
result = df.groupby('region').agg(
total_revenue=('revenue', 'sum'),
avg_revenue=('revenue', 'mean'),
order_count=('revenue', 'count'),
max_order=('revenue', 'max')
)
print(result)
# total_revenue avg_revenue order_count max_order
# region
# East 660 220.000000 3 310
# West 1040 346.666667 3 410دوال مختلفة لأعمدة مختلفة
يمكنكم تمرير قاموس إلى agg()، بحيث يكون كل مفتاح اسم عمود، وتكون كل قيمة دالة، أو قائمة من الدوال، المراد تطبيقها على ذلك العمود. ويتيح لكم ذلك، مثلًا، حساب sum على revenue، وmean على units، وكل ذلك في استدعاء GroupBy واحد.
result = df.groupby('region').agg({
'revenue': ['sum', 'mean'],
'units': ['sum', 'max']
})
print(result)
# revenue units
# sum mean sum max
# region
# East 660 220.000000 63 28
# West 1040 346.666667 105 40MultiIndex للأعمدة الناتج عن dict agg()
عند تمرير قاموس يحوي عدة دوال لكل عمود، تحتوي النتيجة على MultiIndex للأعمدة. يكون المستوى الأول هو اسم العمود الأصلي، ويكون المستوى الثاني اسم الدالة. ويمكنكم تسطيح أسماء هذه الأعمدة وتحويلها إلى سلسلة واحدة باستخدام list comprehension، مما يسهل التعامل مع النتيجة في الخطوات اللاحقة.
result = df.groupby('region').agg({'revenue': ['sum', 'mean'], 'units': 'sum'})
# Flatten MultiIndex columns
result.columns = ['_'.join(c).strip() for c in result.columns]
print(result.columns.tolist())
# ['revenue_sum', 'revenue_mean', 'units_sum']استخدام دوال مخصصة في agg()
بالإضافة إلى أسماء الدوال النصية، يمكنكم تمرير أي كائن قابل للاستدعاء في Python إلى agg(). تستقبل الدالة Series، أي القيم الخاصة بذلك العمود في مجموعة واحدة، ويجب أن تُرجع قيمة مفردة. ويمكنكم تمرير lambda أو دالة مسماة. وتتميز الدوال المخصصة بمرونة أكبر، لكنها أبطأ من الدوال المسمّاة المضمّنة لأنها لا تستفيد من التحسينات على مستوى C.
def revenue_range(s):
return s.max() - s.min()
result = df.groupby('region')['revenue'].agg(['sum', revenue_range])
print(result)
# sum revenue_range
# region
# East 660 160
# West 1040 120عمليات التجميع المسماة باستخدام دوال مخصصة
تعمل صياغة التجميع المُسمّى أيضًا مع الدوال القابلة للاستدعاء، وليس مع الأسماء النصية فقط. ما عليك سوى تمرير صفيف من (column, function) كقيمة للوسيط المسمّى، بحيث تكون الدالة أي دالة قابلة للاستدعاء تقبل Series وتُرجع قيمة مفردة. يحافظ ذلك على سهولة قراءة الشيفرة حتى عند المزج بين الدوال المضمّنة والمنطق المخصّص.
result = df.groupby('region').agg(
total=('revenue', 'sum'),
spread=('revenue', lambda s: s.max() - s.min()),
top_units=('units', 'max')
)
print(result)
# total spread top_units
# region
# East 660 160 28
# West 1040 120 40التجميع دون تحديد عمود
عند استدعاء agg() على GroupBy دون تحديد عمود معيّن، تطبّق Pandas الدالة على كل عمود رقمي في DataFrame. وهذه طريقة سريعة للحصول على ملخّص لجميع الأعمدة الرقمية دفعةً واحدة. انتبه إلى أن الأعمدة التي تحتوي على أنواع بيانات غير رقمية سيتم تجاهلها بصمت في معظم عمليات التجميع.
# Aggregate all numeric columns in one call
result = df.groupby('region').agg(['sum', 'mean'])
print(result)
# revenue units
# sum mean sum mean
# region
# East 660 220.000000 63 21.00
# West 1040 346.666667 105 35.00دمج agg() مع reset_index()
بعد استخدام agg()، تصبح أعمدة التجميع هي الفهرس. ومن الأنماط الشائعة استدعاء reset_index() مباشرةً للحصول على DataFrame مسطّح تكون فيه مفاتيح المجموعات أعمدةً عادية. بعد ذلك يمكنك إعادة تسمية النتيجة وفرزها وتصفيتها مثل أي DataFrame آخر، مما يسهّل تمريرها إلى الخطوات اللاحقة أو تصديرها.
summary = (
df.groupby('region')
.agg(total=('revenue', 'sum'), orders=('revenue', 'count'))
.reset_index()
.sort_values('total', ascending=False)
)
print(summary)
# region total orders
# 1 West 1040 3
# 0 East 660 3agg() مقابل transform() مقابل apply()
من المهم التمييز بين ثلاث طرائق من GroupBy: تعمل agg() على اختزال كل مجموعة إلى قيمة مفردة، فتنتج نتيجةً تحتوي على صفوف أقل من الأصلية. تُرجع transform() مصفوفةً لها الشكل نفسه لشكل الإدخال، ولذلك يمكنك إضافة إحصاءات على مستوى المجموعة كأعمدة جديدة. أما apply() فهي الأكثر مرونة، لكنها أيضًا الأبطأ، وسيجري تناولها في الدرس التالي.
# agg: one row per group
print(df.groupby('region')['revenue'].agg('mean'))
# region
# East 220.0
# West 346.7
# transform: one row per original row (group mean broadcast back)
df['group_mean'] = df.groupby('region')['revenue'].transform('mean')
print(df[['region', 'revenue', 'group_mean']].head())مثال عملي: ملخّص المبيعات
إليك مثالًا واقعيًا متكاملًا: احسب جدولًا ملخّصًا للمبيعات يتضمن إجمالي الإيرادات ومتوسط قيمة الطلب وعدد الطلبات ونطاق الإيرادات لكل منطقة، مع أسماء أعمدة واضحة، ثم رتّبه تنازليًا حسب إجمالي الإيرادات. ويمكن تطبيق هذا النمط مباشرةً في مسارات عمل تحليلات المنتجات والتمويل والتسويق.
summary = (
df.groupby('region')
.agg(
total_revenue=('revenue', 'sum'),
avg_order=('revenue', 'mean'),
num_orders=('revenue', 'count'),
revenue_range=('revenue', lambda s: s.max() - s.min())
)
.reset_index()
.sort_values('total_revenue', ascending=False)
.round(2)
)
print(summary)تحقّق سريعًا
اختبر فهمك للطريقة agg() التي تناولها هذا الدرس.
مراجعة الدرس
تعلّمت في هذا الدرس كيفية إجراء عمليات تجميع متعددة دفعةً واحدة باستخدام agg()، وكيفية استخدام التجميعات المُسمّاة للحصول على أسماء أعمدة واضحة، وكيفية تطبيق دوال مختلفة على أعمدة مختلفة باستخدام dict. بعد ذلك سنستكشف transform() وfilter()، اللتين تضيفان معلومات على مستوى المجموعة إلى DataFrame الأصلي.
تعلم Python مع معلم ذكاء اصطناعي — مجانًا
اكتب وقم بتشغيل أكوادك الفعلية في المتصفح، واحصل على مساعدة فورية من معلم ذكاء اصطناعي متاح 24/7، واستمر من حيث توقفت على الويب أو في التطبيق.
- الدورات
- 30
- الدروس
- 120
الأسئلة الشائعة
هل درس «أسلوب agg()» مجاني؟
نعم — نص درس «أسلوب agg()» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Pandas & NumPy Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Pandas & NumPy Academy 4 دروس في المجموع.
ماذا ستتعلم في «أسلوب agg()»؟
طبّق عدة دوال تجميع في آن واحد باستخدام agg()، ومرّر قاموسًا لحساب إحصاءات مختلفة لأعمدة مختلفة. تتمرن على Pandas & NumPy Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Pandas & NumPy Academy؟
لا تُشترط خبرة سابقة. Pandas & NumPy Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.
كم من الوقت يستغرق درس «أسلوب agg()»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Pandas & NumPy Academy هذا؟
نعم. كل درس في Pandas & NumPy Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.