Pandas: البدء باستخدام بانداس
لقد حل NumPy مشكلة الأداء في الحوسبة الرقمية باستخدام Python، لكن البيانات في الواقع أكثر تعقيدًا من "مصفوفات رقمية بحتة" — فهي تحتوي على أسماء أعمدة، وأنواع مختلطة، وقيم مفقودة، وتشكيلة من صيغ الملفات. تم تصميم Pandas تحديدًا لهذا الغرض: فهي تمنح Python قوة التلاعب بالبيانات المنافسة لـ SQL مع الحفاظ على موجزية الشفرةبرمجيتها وبديهيتها. يبدأ هذا القسم من قيود NumPy ويكشف لماذا يُعتبر Pandas "الجيش السويسري" لتحليل البيانات.
١. ماذا ستتعلم
- ❶ نقاط الضعف في تحليل البيانات باستخدام NumPy
- ❷ المزايا الأساسية لـ Pandas (فهرسة بسمات / أنواع مختلطة / قيم مفقودة / إدخال/إخراج)
- ❸ الاختلافات الرئيسية بين DataFrame و ndarray / Excel / SQL
- ❹ نظرة عامة على نظام Pandas البيئي
- ❺ تثبيت Pandas وتشغيل أول برنامج لك
2. التطور من NumPy إلى Pandas
(1) نقطة الألم: معضلة أليس مع الأنواع المختلطة
أليس هي محللة بيانات تحتاج للتعامل مع بيانات العملاء: الأسماء هي سلاسل نصية، الأعمار أعداد صحيحة، الرواتب أعداد عشرية، وتواريخ التوظيف هي قيم datetime. حاولت استخدام NumPy أولاً:
▶ مثال: صراع NumPy مع بيانات الأنواع المختلطة (الصعوبة ⭐)
> **الخرج:** قم بتشغيل هذا في بيئة Python محلية (pandas 2.x). خادم Piston لا يحتوي على pandas مثبته مسبقاً — قم بتثبيتها محلياً (`pip install pandas`) للمتابعة. قد تختلف القيم الفعلي قليلاً حسب إصدار pandas الخاص بك.
import numpy as np
# بيانات العملاء: الاسم(str)، العمر(int)، الراتب(float)
names = np.array(['Alice', 'Bob', 'Charlie'])
ages = np.array([28, 34, 25])
salaries = np.array([75000.0, 92000.0, 68000.0])
# المشكلة 1: خلط الأنواع يفرض الرفع إلى object
mixed = np.array(['Alice', 28, 75000.0])
print(mixed.dtype) # object — تفقد عمليات رقمية!
# المشكلة 2: لا يمكن حساب المتوسط على مصفوفة object
try:
print(np.mean(mixed)) # خطأ أو نتيجة غير مفيدة
except TypeError:
print("Cannot compute mean on object array")
# المشكلة 3: القيم المفقودة تحتاج معالجة خاصة
ages_with_nan = np.array([28, 34, np.nan, 25])
print(np.mean(ages_with_nan)) # nan — تحتاج np.nanmean()
> **الخرج:** قم بتشغيل هذا في بيئة Python محلية (pandas 2.x). خادم Piston لا يحتوي على pandas مثبته مسبقاً — قم بتثبيتها محلياً (`pip install pandas`) للمتابعة. قد تختلف القيم الفعلي قليلاً حسب إصدار pandas الخاص بك.
القيد الرئيسي لـ NumPy هو التصنيف المتجانس — مصفوفة ndarray فردية يمكنها فقط تخزين نوع بيانات واحد. عندما تضع سلاسل نصية وأرقاماً في نفس المصفوفة، يقوم NumPy برفع كل شيء إلى نوع object، مفقداً بذلك جميع قدرات العمليات المتجهة. بالإضافة إلى ذلك، لا يمتلك NumPy مفهوم "أسماء الأعمدة" ولا نظام مدمج للقيم المفقودة (يمكنك فقط الاعتماد على np.nan، والذي يعمل فقط مع الأعداد العشرية).
(2) الحل: إطار بيانات Pandas الخاص بـ بوب
يتعامل بوب مع نفس البيانات باستخدام إطار بيانات Pandas — في خطوة واحدة سلسة:
▶ مثال: التعامل مع بيانات الأنواع المختلطة مع Pandas (الصعوبة ⭐⭐)
> **الخرج:** قم بتشغيل هذا في بيئة Python محلية (pandas 2.x). خادم Piston لا يحتوي على pandas مثبته مسبقاً — قم بتثبيتها محلياً (`pip install pandas`) للمتابعة. قد تختلف القيم الفعلي قليلاً حسب إصدار pandas الخاص بك.
import pandas as pd
# إطار بيانات واحد يتعامل مع الأنواع المختلطة بشكل طبيعي
df = pd.DataFrame({
'name': ['Alice', 'Bob', 'Charlie'],
'age': [28, 34, 25],
'salary': [75000.0, 92000.0, 68000.0],
'hire_date': pd.to_datetime(['2022-03-15', '2019-08-01', '2023-01-10'])
})
print(df.dtypes)
# name object
# age int64
# salary float64
# hire_date datetime64[ns]
print(df['salary'].mean()) # 78333.33 — يعمل بشكل طبيعي
print(df[df['age'] > 27]) # تصفية حسب الشرط
> **الخرج:** قم بتشغيل هذا في بيئة Python محلية (pandas 2.x). خادم Piston لا يحتوي على pandas مثبته مسبقاً — قم بتثبيتها محلياً (`pip install pandas`) للمتابعة. قد تختلف القيم الفعلي قليلاً حسب إصدار pandas الخاص بك.
كل عمود يحتفظ بنوعه الخاص، العمليات الإحصائية تعمل تلقائياً، والتصفية الشرطية بديهية مثل SQL — هذا هو جمال Pandas.
(3) الميزة: 4 قدرات جوهرية
تضيف Pandas 4 قدرات رئيسية فوق NumPy:
| القدرة | NumPy | Pandas |
|---|---|---|
| فهرسة مُعلَّمة | الوصول حسب الموضع الصحيح فقط | الوصول حسب اسم العمود / تسمية الصف |
| أنواع مختلطة | نوع واحد لكل مصفوفة | مستقل نوع لكل عمود |
| قيم مفقودة | np.nan (الأعداد العشرية فقط) |
NaN / NaT / pd.NA (تغطية كاملة) |
| إدخال/إخراج البيانات | np.loadtxt / np.savetxt |
CSV / Excel / JSON / SQL / Parquet / HDF5 |
3. مزايا Pandas الأساسية بالتفصيل
(1) الفهرسة بالعلامات: البيانات ذاتية الوصف
تقوم NumPy بالوصول إلى البيانات باستخدام arr[0], arr[1, 2] — عليك أن تتذكر "العمود 0 هو الاسم، العمود 2 هو الراتب." تتيح لك Pandas للبيانات أن تتحدث عن نفسها:
▶ مثال: الفهرسة بالعلامات مقابل الفهرسة بالموضع (الصعوبة ⭐)
> **المخرجات:** قم بتشغيل هذا في بيئة Python محلية (pandas 2.x). خادم Piston لا يحتوي على pandas مثبته مسبقًا — قم بتثبيته محليًا (`pip install pandas`) للمتابعة. قد تختلف القيم الفعلي قليلاً حسب إصدار pandas الذي تستخدمه.
import numpy as np
import pandas as pd
# NumPy: يجب ترتيب الأعمدة بالذاكرة
arr = np.array([['Alice', 28, 75000.0],
['Bob', 34, 92000.0]])
# ما هو العمود 2؟ عليك التحقق من التوثيق
print(arr[0, 2]) # 75000.0 — لكن ماذا يعني هذا؟
# Pandas: أسماء الأعمدة توثق ذاتها
df = pd.DataFrame(arr, columns=['name', 'age', 'salary'])
df['age'] = df['age'].astype(int)
df['salary'] = df['salary'].astype(float)
print(df['salary']) # اسم العمود يوضح كل شيء
# 0 75000.0
# 1 92000.0
print(df.loc[0, 'name']) # Alice — وصول قائم على العلامات
> **المخرجات:** قم بتشغيل هذا في بيئة Python محلية (pandas 2.x). خادم Piston لا يحتوي على pandas مثبته مسبقًا — قم بتثبيته محليًا (`pip install pandas`) للمتابعة. قد تختلف القيم الفعلي قليلاً حسب إصدار pandas الذي تستخدمه.
(2) الأنواع المختلطة: نوع بيانات مستقل لكل عمود
كل عمود في DataFrame (وهو سلسلة Series) له نوع بيانات (dtype) خاص به، تمامًا مثلما يمكن لكل عمود في جدول بيانات Excel أن يكون بتنسيق مختلف.
| الميزة | مصفوفة NumPy (ndarray) | إطار Pandas (DataFrame) |
|---|---|---|
| قيد النوع | نوع بيانات واحد للمصفوفة بالكامل | نوع بيانات مستقل لكل عمود |
| أعمدة النصوص | المصفوفة بالكامل تنزل إلى كائن | عمود واحد كـ كائن / StringDtype |
| الأعمدة الرقمية | يجب فصلها عن النصوص | تتعايش مع أعمدة النصوص |
| العمليات | التحويل الشامل للبيانات (vectorization) | عمليات مستقلة لكل عمود |
(3) معالجة القيم المفقودة: دعم أصلي
توفر Pandas نظامًا كاملًا للقيم المفقودة يشمل NaN (قيمة مفقودة من نوع float)، وNaT (قيمة مفقودة من نوع datetime)، وpd.NA (قيمة مفقودة عالمية)، بينما يعمل np.nan في NumPy فقط مع أنواع float.
▶ مثال: مقارنة معالجة القيم المفقودة (الصعوبة ⭐)
> **المخرجات:** قم بتشغيل هذا في بيئة Python محلية (pandas 2.x). خادم Piston لا يحتوي على pandas مثبته مسبقًا — قم بتثبيته محليًا (`pip install pandas`) للمتابعة. قد تختلف القيم الفعلي قليلاً حسب إصدار pandas الذي تستخدمه.
import numpy as np
import pandas as pd
# NumPy: الـ nan في مصفوفة الأعداد الصحيحة يجبر التحويل إلى float
arr = np.array([1, 2, np.nan, 4])
print(arr.dtype) # float64 — فقدت الأعداد الصحيحة!
print(np.mean(arr)) # nan — تحتاج إلى np.nanmean()
# Pandas: تعالج القيم المفقودة لكل عمود على حدة
s = pd.Series([1, 2, pd.NA, 4], dtype='Int64') # عدد صحيح قابل لل null
print(s) # يحتفظ بنوع العدد الصحيح مع <NA>
print(s.mean()) # 2.333 — يتخطى القيم المفقودة تلقائيًا
> **المخرجات:** قم بتشغيل هذا في بيئة Python محلية (pandas 2.x). خادم Piston لا يحتوي على pandas مثبته مسبقًا — قم بتثبيته محليًا (`pip install pandas`) للمتابعة. قد تختلف القيم الفعلي قليلاً حسب إصدار pandas الذي تستخدمه.
(4) أدوات إدخال/إخراج غنية: مركز بيانات شامل
▶ مثال: قراءة البيانات وكتابتها باستخدام Pandas (الصعوبة ⭐)
> **المخرجات:** قم بتشغيل هذا في بيئة Python محلية (pandas 2.x). خادم Piston لا يحتوي على pandas مثبته مسبقًا — قم بتثبيته محليًا (`pip install pandas`) للمتابعة. قد تختلف القيم الفعلي قليلاً حسب إصدار pandas الذي تستخدمه.
import pandas as pd
from io import StringIO
# القراءة من سلسلة نصية بصيغة CSV
csv_data = """name,age,salary
Alice,28,75000
Bob,34,92000
Charlie,25,68000"""
df = pd.read_csv(StringIO(csv_data))
print(df)
# الكتابة بتنسيقات مختلفة
# df.to_csv('output.csv', index=False)
# df.to_excel('output.xlsx', sheet_name='Employees')
# df.to_json('output.json', orient='records')
> **المخرجات:** قم بتشغيل هذا في بيئة Python محلية (pandas 2.x). خادم Piston لا يحتوي على pandas مثبته مسبقًا — قم بتثبيته محليًا (`pip install pandas`) للمتابعة. قد تختلف القيم الفعلي قليلاً حسب إصدار pandas الذي تستخدمه.
4. إطار البيانات مقابل إكسل / SQL: مقارنة توضيحية
(1) مقارنة جنب إلى جنب
| المفهوم | إكسل | جدول SQL | إطار بيانات Pandas |
|---|---|---|---|
| بنية البيانات | ورقة عمل (Sheet) | جدول | إطار بيانات |
| الصفوف | أرقام الصفوف | صفوف | فهرس (تسميات الصفوف) |
| الأعمدة | حروف الأعمدة (A, B, C) | أسماء الأعمدة | أعمدة (أسماء الأعمدة) |
| التصفية | AutoFilter | WHERE | df[condition] |
| الفرز | Sort | ORDER BY | df.sort_values() |
| التجميع | PivotTable | GROUP BY | df.groupby() |
| الدمج | VLOOKUP | JOIN | pd.merge() |
| إضافة أعمدة | أعمدة الصيغ | SELECT expr | df['new'] = expr |
| إزالة التكرارات | Remove Duplicates | DISTINCT | df.drop_duplicates() |
(2) الاختلافات الأساسية
بينما تشترك الثلاثة في مفاهيم متشابهة، تمتلك إطارات البيانات قدرات تفتقدها إكسل وSQL:
- قابل للبرمجة: أتمتة جميع العمليات باستخدام كود Python، وقابلية إعادة الإنتاج بالكامل.
- قابل للتوسيع: تكامل سلس مع NumPy / Matplotlib / scikit-learn.
- معالجة البيانات الكبيرة: معالجة ملايين الصفوف بسهولة (حيث تصل حدود إكسل إلى حوالي مليون صف).
- التحكم في الإصدارات: يمكن إدارة ملفات الكود باستخدام Git؛ بينما لا يمكن ذلك مع ملفات إكسل الثنائية.
5. نظرة عامة على نظام Pandas البيئي
(1) أين يقع Pandas في علم البيانات
mindmap
root((نظام Pandas البيئي))
إدخال البيانات
CSV Excel JSON
قاعدة بيانات SQL
Parquet HDF5
استخراج من الويب
معالجة البيانات
التنظيف
التحويل
الدمج
إعادة التشكيل
تحليل البيانات
المجمعة للتجميع
جدول المحور
السلسلة الزمنية
الملخص الإحصائي
إخراج البيانات
التصور Matplotlib
التعلم الآلي scikit-learn
التقارير HTML Excel
الأساس
مصفوفة NumPy ndarray
> **الإخراج:** قم بتشغيل هذا في بيئة Python محلية (إصدار pandas 2.x). خادم Piston لا يحتوي على pandas مثبته مسبقاً — قم بتثبيته محلياً (`pip install pandas`) للمتابعة. قد تختلف القيم الفعليه قليلاً حسب إصدار pandas لديك.
(2) دور Pandas في المكدس
يجلس Pandas في صميم مكدس علم البيانات بلغة Python، ويعمل كجسر بين الحسابات منخفضة المستوى والتحليل عالي المستوى:
| الطبقة | الأداة | الدور |
|---|---|---|
| الحسابات منخفضة المستوى | NumPy | محرك حسابات عددية عالية الأداء |
| معالجة البيانات | Pandas | تحميل / تنظيف / تحويل / تحليل البيانات الجدولية |
| التصور | Matplotlib / Seaborn | الرسوم البيانية والمجسمات |
| التعلم الآلي | scikit-learn | تدريب النماذج والتنبؤ |
| التعلم العميق | PyTorch / TensorFlow | الشبكات العصبية |
6. مثال كامل: مقارنة سير العمل الكامل بين NumPy و Pandas
▶ مثال: تحليل درجات الطلاب — سير العمل الكامل (الصعوبة ⭐⭐⭐)
> **الإخراج:** قم بتشغيل هذا في بيئة Python محلية (pandas 2.x). لا يحتوي خادم Pandas على pandas مثبته مسبقًا - قم بتثبيته محليًا (`pip install pandas`) للمتابعة. قد تتغير القيم الفعلية قليلاً بناءً على إصدار pandas لديك.
import numpy as np
import pandas as pd
# ============================================
# مقارنة شاملة: NumPy مقابل Pandas
# لسير عمل تحليل درجات الطلاب
# ============================================
# --- البيانات الخام ---
students = ['Alice', 'Bob', 'Charlie', 'Carol', 'David']
math = [85, 92, 78, 95, 88]
english = [90, 85, 82, 88, 91]
science = [88, 90, 75, 93, 86]
# --- طريقة NumPy ---
scores_np = np.array([math, english, science]) # الشكل: (3, 5)
# أي صف يمثل أي مادة؟ يجب تذكر: الصف 0=رياضيات، 1=إنجليزي، 2=علوم
# أي عمود يمثل أي طالب؟ يجب تذكر الترتيب
avg_per_student = scores_np.mean(axis=0)
print("NumPy - المتوسط لكل طالب (حسب الموضع):")
for i, avg in enumerate(avg_per_student):
print(f" الطالب {i}: {avg:.1f}") # من هو الطالب 0؟
# --- طريقة Pandas ---
df = pd.DataFrame({
'student': students,
'math': math,
'english': english,
'science': science
})
df['average'] = df[['math', 'english', 'science']].mean(axis=1)
df['grade'] = df['average'].map(
lambda x: 'A' if x >= 90 else 'B' if x >= 85 else 'C'
)
print("\nPandas - درجات الطلاب:")
print(df[['student', 'average', 'grade']])
# أفضل الأداءات
top = df[df['grade'] == 'A']
print(f"\nطلاب الدرجة A: {top['student'].tolist()}")
# إحصائيات المواد
print("\nإحصائيات المواد:")
print(df[['math', 'english', 'science']].describe())
> **الإخراج:** قم بتشغيل هذا في بيئة Python محلية (pandas 2.x). لا يحتوي خادم Piston على pandas مثبته مسبقًا - قم بتثبيته محليًا (`pip install pandas`) للمتابعة. قد تتغير القيم الفعلية قليلاً بناءً على إصدار pandas لديك.
المخرجات المتوقعة (مقتطف):
NumPy - المتوسط لكل طالب (حسب الموضع):
الطالب 0: 87.7
الطالب 1: 89.0
الطالب 2: 78.3
Pandas - درجات الطلاب:
student average grade
0 Alice 87.7 B
1 Bob 89.0 B
2 Charlie 78.3 C
3 Carol 92.0 A
4 David 88.3 B
طلاب الدرجة A: ['Carol']
إحصائيات المواد:
math english science
count 5.00 5.00 5.00
mean 87.60 87.20 86.40
std 6.19 3.70 7.60
min 78.00 82.00 75.00
max 95.00 91.00 93.00
يمكن لـ NumPy إجراء الحساب، لكن النتائج تفتقر إلى "الوصف الذاتي" — عليك تذكر بشكل منفصل أي رقم يقابل أي طالب. تحتفظ Pandas بالبيانات والعلامات مرتبطة معًا في جميع الأوقات، مما يجعل النتائج واضحة فورًا.
7. التثبيت والتحقق
(1) طرق التثبيت
| الطريقة | الأمر | حالة الاستخدام |
|---|---|---|
| pip | pip install pandas |
الأكثر شيوعاً |
| conda | conda install pandas |
بيئات Anaconda |
| من المصدر | pip install . |
للمطورين / المساهمين |
▶ مثال: التحقق من التثبيت (الصعوبة ⭐)
> **الإخراج:** قم بتشغيل هذا في بيئة Python محلية (pandas 2.x). خادم Piston لا يحتوي على pandas مثبّتاً مسبقاً — قم بتثبيته محلياً (`pip install pandas`) للمتابعة. قد تختلف القيم الفعلية قليلاً حسب إصدار pandas الخاص بك.
import pandas as pd
import numpy as np
print(f"Pandas version: {pd.__version__}")
print(f"NumPy version: {np.__version__}")
# Quick functionality check
df = pd.DataFrame({'x': [1, 2, 3], 'y': [4, 5, 6]})
print(df)
print(f"\nMean of x: {df['x'].mean()}")
> **الإخراج:** قم بتشغيل هذا في بيئة Python محلية (pandas 2.x). خادم Piston لا يحتوي على pandas مثبّتاً مسبقاً — قم بتثبيته محلياً (`pip install pandas`) للمتابعة. قد تختلف القيم الفعلية قليلاً حسب إصدار pandas الخاص بك.
(2) ملاحظات الإصدارات
| الإصدار | الحالة | ملاحظات |
|---|---|---|
| Pandas 3.x | الأحدث | تم إصداره في 2026، تم تفعيل النسخ عند الكتابة افتراضياً |
| Pandas 2.x | مستخدم على نطاق واسع | تم إصداره في 2023، تحسينات كبيرة في الأداء |
| Pandas 1.x | قديم | تم إهمال بعض بناء الجملة |
append) في الإصدار 2.0 ولم يعد مستخدماً هنا.
❓ أسئلة شائعة
append و DataFrame.ix؛ (3) استخدام PyArrow تحت الغطاء لتحسين الأداء. يستخدم هذا البرنامج التعليمي بنية جمل 2.x/3.x — ينبغي لمستخدمي 1.x الترقية.pip install pandas.📖 ملخص
- تُضيف Pandas أربع قدرات أساسية فوق NumPy: الفهرسة المُعَلَّمة، الأنواع المختلطة، معالجة القيم المفقودة، وأدوات الإدخال/الإخراج الغنية
- DataFrame ≈ جدول Excel قابل للبرمجة ≈ جدول SQL في الذاكرة، لكن مع مزايا الأتمتة / القابلية للتوسيع / التحكم في الإصدارات
- تقع Pandas في صميم حزمة علم البيانات بلغة بايثون: NumPy → Pandas → Matplotlib/scikit-learn
- 95% من أعمال تحليل البيانات تتم باستخدام Pandas؛ بينما NumPy هو محرك الحسابات الأساسي
- Pandas 2.x/3.x هما الإصدارات الرئيسية الحالية؛ بعض صيغ 1.x قد تم إهمالها
- للبيانات التي تتجاوز سعة جهاز واحد، انتقل إلى Dask/Polars/PySpark للتوسع
📝 تمارين
- أساسي (الصعوبة ⭐): قم بتثبيت Pandas وشغّل كود التحقق للتأكد من أن
pd.__version__يُظهر النتيجة بشكل صحيح. أنشئ DataFrame يحتوي على 3 أعمدة (الاسم / العمر / المدينة) واطبعه. - متوسط (الصعوبة ⭐⭐): قم بمعالجة بيانات درجات الطلاب نفسها (5 طلاب / 3 مواد) باستخدام كلاً من NumPy و Pandas. احسب متوسط درجات كل طالب وأعلى درجة لكل مادة. قارن حجم الكود وسهولة قراءته في كلا النهجين.
- تحدي (الصعوبة ⭐⭐⭐): قم بتحميل بيانات تحتوي على قيم مفقودة من سلسلة CSV، ثم استخدم Pandas لـ: عرض المعلومات → ملء القيم المفقودة → التجميع حسب الفئة وحساب الإحصائيات → إخراج الوصف. استخدم Pandas فقط طوال الوقت — لا يُسمح بحلقات التكرار.