أطلق العنان لقوة GroupBy في Pandas لتحليل البيانات. يستكشف هذا الدليل تقنيات التجميع والتحويل مع أمثلة عملية للبيانات الدولية.
إتقان عمليات GroupBy في Pandas: التجميع مقابل التحويل
تُعد Pandas، حجر الزاوية في معالجة البيانات بلغة بايثون، أداة قوية لتحليل البيانات وفهمها: وهي عملية GroupBy. تتيح لك هذه الميزة تقسيم بياناتك إلى مجموعات بناءً على خصائص مشتركة ثم تطبيق دوال على هذه المجموعات، لتكشف عن رؤى قد تظل مخفية لولا ذلك. تتعمق هذه المقالة في عمليتين رئيسيتين لـ GroupBy: التجميع (aggregation) والتحويل (transformation)، وتقدم أمثلة عملية وشروحات مناسبة لمحترفي البيانات حول العالم.
فهم مفهوم GroupBy
في جوهرها، عملية GroupBy هي عملية تتضمن ثلاث خطوات رئيسية: تقسيم البيانات إلى مجموعات بناءً على معيار واحد أو أكثر، وتطبيق دالة على كل مجموعة بشكل مستقل، ودمج النتائج في بنية بيانات جديدة. تُعد استراتيجية "التقسيم-التطبيق-الدمج" هذه مفهومًا أساسيًا في تحليل البيانات وتوفر إطارًا مرنًا لاستكشاف مجموعات البيانات المعقدة.
تكمن قوة GroupBy في قدرتها على التعامل مع أنواع وهياكل البيانات المختلفة، مما يجعلها قابلة للتطبيق عبر مجالات متنوعة. سواء كنت تحلل بيانات المبيعات من مناطق متعددة، أو قراءات أجهزة الاستشعار من أجهزة مختلفة، أو نشاط وسائل التواصل الاجتماعي عبر التركيبة السكانية، يمكن أن تساعدك GroupBy في استخلاص رؤى ذات مغزى.
التجميع (Aggregation): تلخيص البيانات داخل المجموعات
التجميع هو عملية حساب الإحصائيات التلخيصية لكل مجموعة. توفر هذه الإحصائيات نظرة عامة موجزة عن خصائص المجموعة، مما يتيح لك مقارنة الأجزاء المختلفة من بياناتك وتباينها. تتضمن دوال التجميع الشائعة ما يلي:
sum(): يحسب مجموع القيم داخل كل مجموعة.mean(): يحسب متوسط القيمة داخل كل مجموعة.median(): يحسب القيمة الوسيطة داخل كل مجموعة.min(): يجد القيمة الدنيا داخل كل مجموعة.max(): يجد القيمة القصوى داخل كل مجموعة.count(): يحسب عدد القيم غير الخالية داخل كل مجموعة.size(): يُرجع حجم كل مجموعة (بما في ذلك القيم الخالية).std(): يحسب الانحراف المعياري داخل كل مجموعة.var(): يحسب التباين داخل كل مجموعة.
أمثلة عملية على التجميع
دعنا نأخذ في الاعتبار مجموعة بيانات مبيعات دولية لشركة تجارة إلكترونية افتراضية. تتضمن البيانات معلومات حول فئة المنتج، وبلد البيع، ومبلغ المبيعات.
import pandas as pd
# Sample data
data = {
'Category': ['Electronics', 'Clothing', 'Electronics', 'Clothing', 'Home Goods', 'Electronics', 'Clothing', 'Home Goods'],
'Country': ['USA', 'UK', 'Canada', 'USA', 'Germany', 'UK', 'Canada', 'Germany'],
'Sales': [100, 50, 75, 60, 80, 90, 45, 70]
}
df = pd.DataFrame(data)
print(df)
سيكون الناتج:
Category Country Sales
0 Electronics USA 100
1 Clothing UK 50
2 Electronics Canada 75
3 Clothing USA 60
4 Home Goods Germany 80
5 Electronics UK 90
6 Clothing Canada 45
7 Home Goods Germany 70
مثال 1: حساب إجمالي المبيعات لكل فئة
لحساب إجمالي المبيعات لكل فئة منتج، يمكننا استخدام دالة groupby() متبوعة بدالة التجميع sum().
category_sales = df.groupby('Category')['Sales'].sum()
print(category_sales)
سيكون الناتج:
Category
Clothing 155
Electronics 265
Home Goods 150
Name: Sales, dtype: int64
مثال 2: حساب متوسط المبيعات لكل بلد
وبالمثل، لحساب متوسط المبيعات لكل بلد، يمكننا استخدام دالة التجميع mean().
country_sales = df.groupby('Country')['Sales'].mean()
print(country_sales)
سيكون الناتج:
Country
Canada 60.0
Germany 75.0
UK 70.0
USA 80.0
Name: Sales, dtype: float64
مثال 3: استخدام دوال تجميع متعددة
تتيح لك Pandas تطبيق دوال تجميع متعددة في وقت واحد باستخدام دالة agg(). يوفر هذا ملخصًا شاملاً لخصائص المجموعة.
category_summary = df.groupby('Category')['Sales'].agg(['sum', 'mean', 'median', 'count'])
print(category_summary)
سيكون الناتج:
sum mean median count
Category
Clothing 155 51.666667 50.0 3
Electronics 265 88.333333 90.0 3
Home Goods 150 75.000000 75.0 2
مثال 4: دوال التجميع المخصصة
يمكنك أيضًا تعريف دوال التجميع المخصصة الخاصة بك باستخدام تعبيرات لامدا (lambda expressions) أو دوال مسماة. يتيح لك هذا حساب إحصائيات معينة غير متوفرة في دوال التجميع القياسية.
# Custom function to calculate the range (max - min)
def custom_range(x):
return x.max() - x.min()
category_summary = df.groupby('Category')['Sales'].agg(['sum', 'mean', custom_range])
print(category_summary)
سيكون الناتج:
sum mean custom_range
Category
Clothing 155 51.666667 15
Electronics 265 88.333333 25
Home Goods 150 75.000000 10
التحويل (Transformation): تعديل البيانات داخل المجموعات
من ناحية أخرى، يتضمن التحويل تعديل البيانات داخل كل مجموعة بناءً على بعض العمليات الحسابية. على عكس التجميع، الذي يُرجع قيمة ملخصة لكل مجموعة، يُرجع التحويل قيمة لكل صف في البيانات الأصلية، ولكن يتم حساب القيمة بناءً على المجموعة التي ينتمي إليها ذلك الصف. تحافظ عمليات التحويل على الفهرس والشكل الأصلي لإطار البيانات (DataFrame).
تتضمن حالات الاستخدام الشائعة للتحويل ما يلي:
- توحيد البيانات داخل كل مجموعة.
- حساب الرتبة أو النسبة المئوية داخل كل مجموعة.
- ملء القيم المفقودة بناءً على إحصائيات المجموعة.
أمثلة عملية على التحويل
دعنا نواصل مع بيانات المبيعات الدولية الخاصة بنا. يمكننا تطبيق التحويل لإجراء حسابات تتعلق بأرقام المبيعات داخل كل بلد.
مثال 1: توحيد بيانات المبيعات داخل كل بلد (درجة Z)
يتضمن توحيد البيانات تحويل القيم بحيث يكون متوسطها 0 وانحرافها المعياري 1. وهذا مفيد لمقارنة البيانات عبر مقاييس وتوزيعات مختلفة. يمكننا استخدام دالة transform() جنبًا إلى جنب مع تعبير لامدا (lambda expression) لتحقيق ذلك.
from scipy.stats import zscore
df['Sales_Zscore'] = df.groupby('Country')['Sales'].transform(zscore)
print(df)
سيكون الناتج:
Category Country Sales Sales_Zscore
0 Electronics USA 100 1.000000
1 Clothing UK 50 -1.000000
2 Electronics Canada 75 1.000000
3 Clothing USA 60 -1.000000
4 Home Goods Germany 80 1.000000
5 Electronics UK 90 1.000000
6 Clothing Canada 45 -1.000000
7 Home Goods Germany 70 -1.000000
يحتوي عمود Sales_Zscore الآن على قيم المبيعات الموحدة لكل بلد. القيم التي تزيد عن 0 هي أعلى من متوسط المبيعات لذلك البلد، والقيم التي تقل عن 0 هي أقل من المتوسط.
مثال 2: حساب ترتيب المبيعات داخل كل فئة
لحساب ترتيب كل عملية بيع ضمن فئتها، يمكننا استخدام دالة rank() داخل دالة transform().
df['Sales_Rank'] = df.groupby('Category')['Sales'].transform(lambda x: x.rank(method='dense'))
print(df)
سيكون الناتج:
Category Country Sales Sales_Zscore Sales_Rank
0 Electronics USA 100 1.000000 3.0
1 Clothing UK 50 -1.000000 2.0
2 Electronics Canada 75 1.000000 1.0
3 Clothing USA 60 -1.000000 3.0
4 Home Goods Germany 80 1.000000 2.0
5 Electronics UK 90 1.000000 2.0
6 Clothing Canada 45 -1.000000 1.0
7 Home Goods Germany 70 -1.000000 1.0
يشير عمود Sales_Rank إلى ترتيب كل عملية بيع ضمن فئتها المعنية. تضمن وسيطة `method='dense'` تعيين مراتب متتالية بدون فجوات.
مثال 3: ملء القيم المفقودة بناءً على متوسط المجموعة
دعنا نقدم بعض القيم المفقودة في بيانات المبيعات ثم نملأها بناءً على متوسط المبيعات لكل بلد.
import numpy as np
# Introduce missing values
df.loc[[0, 3], 'Sales'] = np.nan
print(df)
# Fill missing values based on country mean
df['Sales_Filled'] = df['Sales'].fillna(df.groupby('Country')['Sales'].transform('mean'))
print(df)
سيبدو إطار البيانات الأولي الذي يحتوي على قيم مفقودة كالتالي:
Category Country Sales Sales_Zscore Sales_Rank
0 Electronics USA NaN 1.000000 3.0
1 Clothing UK 50 -1.000000 2.0
2 Electronics Canada 75 1.000000 1.0
3 Clothing USA NaN -1.000000 3.0
4 Home Goods Germany 80 1.000000 2.0
5 Electronics UK 90 1.000000 2.0
6 Clothing Canada 45 -1.000000 1.0
7 Home Goods Germany 70 -1.000000 1.0
وبعد ملء القيم المفقودة:
Category Country Sales Sales_Zscore Sales_Rank Sales_Filled
0 Electronics USA NaN 1.000000 3.0 NaN
1 Clothing UK 50 -1.000000 2.0 50.0
2 Electronics Canada 75 1.000000 1.0 75.0
3 Clothing USA NaN -1.000000 3.0 NaN
4 Home Goods Germany 80 1.000000 2.0 80.0
5 Electronics UK 90 1.000000 2.0 90.0
6 Clothing Canada 45 -1.000000 1.0 45.0
7 Home Goods Germany 70 -1.000000 1.0 70.0
ملاحظة هامة: نظرًا لعدم وجود متوسط (mean) سابق لـ `USA`، فإن القيم الناتجة في `Sales_Filled` هي `NaN`. يُعد التعامل مع حالات الحواف مثل هذه أمرًا بالغ الأهمية لتحليل البيانات الموثوق به ويجب أخذه في الاعتبار أثناء التنفيذ.
التجميع مقابل التحويل: الاختلافات الرئيسية
بينما يُعد كل من التجميع والتحويل عمليتين قويتين لـ GroupBy، فإنهما يخدمان أغراضًا مختلفة ولهما خصائص مميزة:
- شكل المخرج: يقلل التجميع حجم البيانات، مُرجعًا قيمة واحدة لكل مجموعة. يحافظ التحويل على الحجم الأصلي للبيانات، مُرجعًا قيمة محوّلة لكل صف.
- الغرض: يُستخدم التجميع لتلخيص البيانات واكتساب رؤى حول خصائص المجموعة. يُستخدم التحويل لتعديل البيانات داخل المجموعات، غالبًا للتوحيد القياسي أو التطبيع.
- القيمة المرجعة: يُرجع التجميع إطار بيانات (DataFrame) أو سلسلة (Series) جديدة بالقيم المجمعة. يُرجع التحويل سلسلة (Series) بالقيم المحوّلة، والتي يمكن بعد ذلك إضافتها كعمود جديد إلى إطار البيانات الأصلي.
يعتمد الاختيار بين التجميع والتحويل على أهدافك التحليلية المحددة. إذا كنت بحاجة إلى تلخيص البيانات ومقارنة المجموعات، فالتجميع هو الخيار المناسب. إذا كنت بحاجة إلى تعديل البيانات داخل المجموعات مع الحفاظ على بنية البيانات الأصلية، فإن التحويل هو الخيار الأفضل.
تقنيات GroupBy المتقدمة
إلى جانب التجميع والتحويل الأساسيين، تقدم GroupBy في Pandas مجموعة من التقنيات المتقدمة لتحليل بيانات أكثر تطوراً.
تطبيق دوال مخصصة باستخدام apply()
توفر دالة apply() أكبر قدر من المرونة، مما يتيح لك تطبيق أي دالة مخصصة على كل مجموعة. يمكن لهذه الدالة أن تؤدي أي عملية، بما في ذلك التجميع أو التحويل أو حتى العمليات الحسابية الأكثر تعقيدًا.
def custom_function(group):
# Calculate the sum of sales for each category in a group, only if there is more than one row in the group
if len(group) > 1:
group['Sales_Sum'] = group['Sales'].sum()
else:
group['Sales_Sum'] = 0 # Or some other default value
return group
df_applied = df.groupby('Country').apply(custom_function)
print(df_applied)
في هذا المثال، نحدد دالة مخصصة تحسب مجموع المبيعات داخل كل مجموعة (البلد). تطبق دالة apply() هذه الدالة على كل مجموعة، مما ينتج عنه عمود جديد يحتوي على مجموع المبيعات لتلك المجموعة.
ملاحظة هامة: قد تكون دالة apply أكثر كثافة حسابيًا من الطرق الأخرى. قم بتحسين التعليمات البرمجية الخاصة بك وفكر في تطبيقات بديلة عند العمل مع مجموعات بيانات ضخمة.
التجميع حسب أعمدة متعددة
يمكنك تجميع بياناتك حسب أعمدة متعددة لإنشاء شرائح أكثر تفصيلاً. يتيح لك هذا تحليل البيانات بناءً على تقاطع خصائص متعددة.
category_country_sales = df.groupby(['Category', 'Country'])['Sales'].sum()
print(category_country_sales)
سيؤدي هذا إلى تجميع البيانات حسب كل من Category و Country، مما يتيح لك حساب إجمالي المبيعات لكل فئة داخل كل بلد. يوفر هذا عرضًا أكثر تفصيلاً لأداء المبيعات عبر المناطق وخطوط المنتجات المختلفة.
التكرار عبر المجموعات
لتحليل أكثر تعقيدًا، يمكنك التكرار عبر المجموعات باستخدام حلقة for. يتيح لك هذا الوصول إلى كل مجموعة على حدة وإجراء عمليات مخصصة عليها.
for name, group in df.groupby('Category'):
print(f"Category: {name}")
print(group)
سيؤدي هذا إلى التكرار عبر كل فئة منتج وطباعة البيانات المقابلة. يمكن أن يكون هذا مفيدًا لإجراء تحليل مخصص أو إنشاء تقارير لكل فئة.
أفضل الممارسات لاستخدام GroupBy
لضمان استخدام فعال وناجع لـ GroupBy، ضع في اعتبارك أفضل الممارسات التالية:
- فهم بياناتك: قبل تطبيق
GroupBy، خذ الوقت الكافي لفهم بياناتك وتحديد معايير التجميع ودوال التجميع/التحويل ذات الصلة. - اختر العملية الصحيحة: فكر مليًا فيما إذا كان التجميع أو التحويل هو الخيار الأنسب لأهدافك التحليلية.
- التحسين للأداء: بالنسبة لمجموعات البيانات الكبيرة، فكر في تحسين التعليمات البرمجية الخاصة بك باستخدام العمليات المتجهة (vectorized operations) وتجنب الحلقات غير الضرورية.
- التعامل مع القيم المفقودة: كن على دراية بالقيم المفقودة في بياناتك وتعامل معها بشكل مناسب باستخدام دوال مثل
fillna()أوdropna(). - توثيق التعليمات البرمجية الخاصة بك: وثق التعليمات البرمجية الخاصة بك بوضوح لشرح الغرض من كل عملية
GroupByوالمنطق وراء اختياراتك.
الخاتمة
تُعد GroupBy في Pandas أداة قوية لتحليل البيانات، حيث تمكنك من تقسيم بياناتك، وتطبيق دوال على كل مجموعة، واستخلاص رؤى قيمة. من خلال إتقان تقنيات التجميع والتحويل، يمكنك إطلاق العنان للإمكانات الكاملة لبياناتك واكتساب فهم أعمق للأنماط والاتجاهات الأساسية. سواء كنت تحلل بيانات المبيعات أو قراءات أجهزة الاستشعار أو نشاط وسائل التواصل الاجتماعي، يمكن أن تساعدك GroupBy في اتخاذ قرارات تستند إلى البيانات وتحقيق أهدافك التحليلية. احتضن قوة GroupBy وارتق بمهاراتك في تحليل البيانات إلى المستوى التالي.
قدم هذا الدليل نظرة عامة شاملة لعمليات GroupBy في Pandas مع التركيز على التجميع مقابل التحويل. باستخدام هذه التقنيات على البيانات الدولية، يتمكن علماء البيانات في جميع أنحاء العالم من استخلاص رؤى أعمال حاسمة عبر مجموعات بيانات متنوعة. مارس، جرب، وصمم هذه التقنيات لتناسب احتياجاتك الخاصة للاستفادة من الإمكانات الكاملة لـ Pandas.