Pandas & NumPy Academy · درس

أسلوب agg()

طبّق عدة دوال تجميع في آن واحد باستخدام agg()، ومرّر قاموسًا لحساب إحصاءات مختلفة لأعمدة مختلفة.

الدرس 3 من 413 خطوة

أسلوب 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  40

MultiIndex للأعمدة الناتج عن 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       3

agg() مقابل 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 يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. نمط التقسيم والتطبيق والدمج
  2. GroupBy بمفتاح واحد أو عدة مفاتيح
  3. أسلوب agg()
  4. تحويل GroupBy وتصفيته
← العودة إلى Pandas & NumPy Academy