مقدمة
الكائن GroupBy في pandas هو أداة قوية لتجميع
وتحليل البيانات. باستخدام طرق مثل aggregate()،
filter()، transform()، و
apply()، يمكنك إجراء العمليات على مجموعات بياناتك بكفاءة.
aggregate()
طريقة aggregate() تطبق دوال التجميع مثل sum،
mean، أو count على مجموعات البيانات.
مثال من العالم الحقيقي: حساب إجمالي ومتوسط المبيعات حسب الفئة.
import pandas as pd
# بيانات المبيعات
data = {'Category': ['إلكترونيات', 'ملابس', 'إلكترونيات', 'ملابس'],
'Sales': [1500, 1200, 1700, 800]}
df = pd.DataFrame(data)
# التجميع حسب الفئة
grouped = df.groupby('Category')
result = grouped.aggregate(['sum', 'mean'])
print(result)
الناتج:
Sales
sum mean
Category
ملابس 2000 1000.0
إلكترونيات 3200 1600.0
filter()
استخدم filter() لتضمين أو استبعاد المجموعات بناءً على
شرط.
مثال من العالم الحقيقي: عرض الفئات التي تتجاوز مبيعاتها الإجمالية 2500.
# تصفية الفئات التي تتجاوز مبيعاتها 2500
filtered = grouped.filter(lambda x: x['Sales'].sum() > 2500)
print(filtered)
الناتج:
Category Sales
إلكترونيات 1500
إلكترونيات 1700
transform()
تطبق طريقة transform() دالة على كل مجموعة وتعيد DataFrame
بنفس الشكل الأصلي.
مثال من العالم الحقيقي: حساب نسبة كل عملية بيع من إجمالي المبيعات في فئتها.
# حساب نسبة المبيعات
df['Percent'] = grouped['Sales'].transform(lambda x: x / x.sum() * 100)
print(df)
الناتج:
Category Sales Percent
إلكترونيات 1500 46.88
إلكترونيات 1700 53.12
ملابس 1200 60.00
ملابس 800 40.00
apply()
تطبق طريقة apply() دالة مخصصة على كل مجموعة وتعيد
النتيجة.
مثال من العالم الحقيقي: العثور على أكبر فرق مبيعات داخل كل فئة.
# حساب أكبر فرق مبيعات في كل فئة
result = grouped.apply(lambda x: x['Sales'].max() - x['Sales'].min())
print(result)
الناتج:
Category
ملابس 400
إلكترونيات 200
| الميزة | تجميع (aggregate()) | تصفية (filter()) | تحويل (transform()) | تطبيق (apply()) |
|---|---|---|---|---|
| الغرض منها | إجراء عمليات إحصائية مثل الجمع، المتوسط، الحد الأدنى أو الأقصى على المجموعات. | اختيار المجموعات التي تحقق شرطًا معينًا وإزالة غير المطابقة. | تعديل البيانات داخل كل مجموعة مع الاحتفاظ بعدد الصفوف كما هو. | تطبيق دالة مخصصة على مستوى الصفوف أو الأعمدة. |
| الاستخدام الشائع | حساب الإجمالي، المتوسط، أو القيم القصوى لكل مجموعة. | الاحتفاظ فقط بالمجموعات التي يتجاوز مجموع قيمها حدًا معينًا. | تطبيع القيم أو حساب النسب المئوية داخل كل مجموعة. | تنفيذ عمليات مخصصة، مثل تحويل النصوص أو إجراء حسابات معقدة. |
| ما تُرجعه الدالة | قيمة واحدة أو جدول جديد حسب الوظائف المستخدمة. | جزء من البيانات الأصلية بناءً على الشرط. | بيانات بنفس عدد الصفوف الأصلي. | يمكن أن تُرجع أي نوع من البيانات (رقم، نص، جدول...). |
| هل تحافظ على نفس عدد الصفوف؟ | لا، يتم تقليل الأبعاد. | لا، يتم حذف الصفوف غير المطابقة. | نعم، تبقى نفس عدد الصفوف. | يمكن أن يتغير الشكل حسب الدالة المستخدمة. |
| تُستخدم مع groupby؟ | نعم | نعم | نعم | نعم |
| سلوك الدالة | تُرجع قيمة موجزة لكل مجموعة. | تُعيد True للمجموعات التي يجب الاحتفاظ بها وFalse للباقي. | تُطبق العملية على كل عنصر داخل المجموعة دون تغيير العدد. | يمكن أن تُنفذ أي عملية على الصفوف أو الأعمدة. |
| مثال على الاستخدام | df.groupby('Category').agg({'Sales': ['sum', 'mean']}) |
df.groupby('Category').filter(lambda x: x['Sales'].sum() > 1000) |
df.groupby('Category')['Sales'].transform(lambda x: x / x.mean()) |
df.apply(lambda row: row['Sales'] * 2, axis=1) |
| الأداء | سريع عند استخدام الدوال المدمجة. | فعال ولكن يمكن أن يكون بطيئًا عند التعامل مع شروط معقدة. | أسرع من apply() عند العمل على مستوى العنصر. | يمكن أن يكون بطيئًا جدًا إذا لم يُستخدم بكفاءة. |
| يدعم استخدام وظائف متعددة؟ | نعم | لا | لا | نعم |
| هل تحتفظ بتجميع البيانات؟ | لا | لا | نعم | لا |