Pandas: الإطار الأساسي للبيانات

آخر تحديث: 2026-08-26

البيانات الإطارية هي بنية البيانات الأساسية في Pandas — جدول ثنائي الأبعاد مُسمَّى حيث كل عمود هو سلسلة (Series) مع نوع البيانات (dtype) والاسم الخاص بها. يمكن تخيّل البيانات الإطارية كورقة Excel أو جدول SQL مكتوب بلغة برمجة، ولكنها أقوى: قابلة للبرمجة، وقابلة للتوسيع، ومُتحكم بإصداراتها. يأخذك هذا القسم في عمق البنية الأساسية للبيانات الإطارية.

⚠️ ملاحظة: يتطلب الكود أدناه بيئة بايثون محلية.

١. ما ستتعلمه



2. جدول المنتجات لتجارة إلكترونية تابعة لـ "تشارلي"

(1) نقطة الضعف: إدارة أعمدة متعددة معًا

يدير "تشارلي" موقعًا للتجارة الإلكترونية ويحتاج إلى إدارة بيانات المنتجات: الاسم، الفئة، السعر، المخزون، والتقييم — أي 5 أعمدة من أنواع مختلفة. باستخدام Series فقط، سيحتاج إلى الاحتفاظ بـ 5 كائنات Series منفصلة والتأكد من بقاء فهارسها متوافقة.

PYTHON
import pandas as pd

# 5 Series منفصلة — يجب الحفاظ على توافق الفهرس يدويًا
names = pd.Series(['Laptop', 'Phone', 'Tablet', 'Monitor', 'Keyboard'])
categories = pd.Series(['Electronics', 'Electronics', 'Electronics', 'Electronics', 'Accessories'])
prices = pd.Series([999.99, 699.99, 349.99, 449.99, 79.99])
stocks = pd.Series([50, 120, 80, 35, 200])
ratings = pd.Series([4.7, 4.5, 4.3, 4.6, 4.2])
# أي سعر ينتمي لأي منتج؟ آمل أن يظل الفهرس متوافقًا!
TEXT 📖 للعرض فقط
> **المخرجات:** قم بتشغيل هذا في بيئة Python محلية (pandas 2.x). خادم Piston لا يحتوي على pandas مثبتًا مسبقًا — قم بتثبيته محليًا (`pip install pandas`) للمتابعة. قد تختلف القيم الفعلية قليًلا حسب إصدار pandas لديك.

(2) الحل: الـ DataFrame تربط الأعمدة معًا

▶ مثال: إدارة بيانات المنتجات باستخدام DataFrame (الصعوبة ⭐)

TEXT 📖 للعرض فقط
> **المخرجات:** قم بتشغيل هذا في بيئة Python محلية (pandas 2.x). خادم Piston لا يحتوي على pandas مثبتًا مسبقًا — قم بتثبيته محليًا (`pip install pandas`) للمتابعة. قد تختلف القيم الفعلية قليًلا حسب إصدار pandas لديك.
PYTHON
import pandas as pd

df = pd.DataFrame({
    'name': ['Laptop', 'Phone', 'Tablet', 'Monitor', 'Keyboard'],
    'category': ['Electronics', 'Electronics', 'Electronics', 'Electronics', 'Accessories'],
    'price': [999.99, 699.99, 349.99, 449.99, 79.99],
    'stock': [50, 120, 80, 35, 200],
    'rating': [4.7, 4.5, 4.3, 4.6, 4.2]
})

print(df)
#        name     category    price  stock  rating
# 0    Laptop  Electronics   999.99     50     4.7
# 1     Phone  Electronics   699.99    120     4.5
# 2    Tablet  Electronics   349.99     80     4.3
# 3   Monitor  Electronics   449.99     35     4.6
# 4  Keyboard  Accessories    79.99    200     4.2

print(df['name'])     # سلسلة (Series)
print(df.loc[0])      # الصف الأول كسلسلة (Series)
TEXT 📖 للعرض فقط
> **المخرجات:** قم بتشغيل هذا في بيئة Python محلية (pandas 2.x). خادم Piston لا يحتوي على pandas مثبتًا مسبقًا — قم بتثبيته محليًا (`pip install pandas`) للمتابعة. قد تختلف القيم الفعلية قليًلا حسب إصدار pandas لديك.

جميع الأعمدة الخمسة مرتبطة معًا في DataFrame واحد، بأسماء أعمدة وصفية ذاتيًا وتوافق تلقائي للصفوف.

(3) الفائدة: الـ DataFrame هو "مجموعة من الأعمدة"

الـ DataFrame ليس "مصفوفة (ndarray) ثنائية الأبعاد" — بل هو قاموس مرتب من الـ Series. كل عمود هو Series مستقل ببنية بياناته الخاصة (dtype)، لكن جميع الأعمدة تتشارك نفس الفهرس الخاص بالصفوف.


3. الهيكل الأساسي لإطار البيانات (DataFrame)

(1) مخطط الهيكل الداخلي

100%
graph TB
    subgraph DataFrame
        direction TB
        COL["فهرس الأعمدة<br/>(الاسم، الفئة، السعر، المخزون، التقييم)"]
        ROW["فهرس الصفوف<br/>(0, 1, 2, 3, 4)"]
        S1["Series: الاسم<br/>dtype: object"]
        S2["Series: الفئة<br/>dtype: object"]
        S3["Series: السعر<br/>dtype: float64"]
        S4["Series: المخزون<br/>dtype: int64"]
        S5["Series: التقييم<br/>dtype: float64"]
    end
    ROW --> S1
    ROW --> S2
    ROW --> S3
    ROW --> S4
    ROW --> S5
    COL --> S1
    COL --> S2
    COL --> S3
    COL --> S4
    COL --> S5
TEXT 📖 للعرض فقط
> **Output:** قم بتشغيل هذا في بيئة Python محلية (pandas 2.x). خادم Piston ليس لديه pandas مثبت مسبقاً — قم بتثبيته محلياً (`pip install pandas`) للمتابعة. القيم الفعلية قد تختلف قليلاً اعتماداً على إصدار pandas الخاص بك.
المفهوم الوصف التشبيه
فهرس الصفوف (Row Index) تسميات الصفوف المشتركة بين جميع الأعمدة أرقام الصفوف في Excel
الأعمدة (Columns) تسمية الاسم لكل عمود رؤوس الأعمدة في Excel
سلسلة العمود (Column Series) كل عمود كسلسلة (Series) مستقلة عمود Excel مفرد
القيم (values) المصفوفة ثنائية الأبعاد (ndarray) الأساسية مصفوفة البيانات الأولية

(2) إطار البيانات (DataFrame) مقابل المصفوفة ثنائية الأبعاد (2D ndarray)

الميزة مصفوفة NumPy ثنائية الأبعاد (2D ndarray) إطار بيانات Pandas (DataFrame)
قيد النوع (Type constraint) نوع بيانات عام واحد (dtype) نوع بيانات مستقل لكل عمود
تسميات الصفوف لا يوجد (positions صحيحة فقط) فهرس (Index) (قابل للتخصيص)
تسميات الأعمدة لا يوجد (positions صحيحة فقط) الأعمدة (أسماء الأعمدة)
اختيار العمود arr[:, 2] df['price']
اختيار الصف arr[0, :] df.loc[0]
الأنواع المختلطة غير مدعوم مدعوم بشكل أصلي
القيم المفقودة np.nan (float فقط) NaN / NaT / pd.NA
📌 نقطة جوهرية: خاصية values في إطار البيانات (DataFrame) تُعيد مصفوفة ثنائية الأبعاد (2D ndarray)، ولكن عند وجود أنواع مختلطة يصبح نوع البيانات (dtype) هو كائن — مما يُسبب انخفاضاً كبيراً في الأداء. للعمليات الرقمية البحتة، قم باختيار الأعمدة الرقمية أولاً، ثم استدعي .values.



4. طرق متعددة لإنشاء إطار بيانات

(1) من قاموس (الأكثر شيوعاً)

▶ مثال: إنشاء إطار بيانات من قاموس (الصعوبة ⭐)

TEXT 📖 للعرض فقط
> **Output:** Run this in a local Python environment (pandas 2.x). The Piston server does not have pandas pre-installed — install it locally (`pip install pandas`) to follow along. Actual values may vary slightly depending on your pandas version.
PYTHON
import pandas as pd

# Dict of lists: keys = column names, values = column data
df = pd.DataFrame({
    'product': ['Coffee', 'Tea', 'Juice', 'Water'],
    'price': [4.50, 3.80, 5.20, 1.50],
    'calories': [5, 2, 120, 0]
})
print(df)
#   product  price  calories
# 0  Coffee   4.50         5
# 1     Tea   3.80         2
# 2    Juice   5.20       120
# 3    Water   1.50         0

# Custom row index
df2 = pd.DataFrame({
    'product': ['Coffee', 'Tea', 'Juice'],
    'price': [4.50, 3.80, 5.20]
}, index=['A001', 'A002', 'A003'])
print(df2.index)  # Index(['A001', 'A002', 'A003'])
TEXT 📖 للعرض فقط
> **Output:** Run this in a local Python environment (pandas 2.x). The Piston server does not have pandas pre-installed — install it locally (`pip install pandas`) to follow along. Actual values may vary slightly depending on your pandas version.

(2) من قائمة قوائم

▶ مثال: إنشاء إطار بيانات من قائمة قوائم (الصعوبة ⭐)

TEXT 📖 للعرض فقط
> **Output:** Run this in a local Python environment (pandas 2.x). The Piston server does not have pandas pre-installed — install it locally (`pip install pandas`) to follow along. Actual values may vary slightly depending on your pandas version.
PYTHON
import pandas as pd

# List of lists: each inner list = one row
data = [
    ['Coffee', 4.50, 5],
    ['Tea', 3.80, 2],
    ['Juice', 5.20, 120],
    ['Water', 1.50, 0]
]
df = pd.DataFrame(data, columns=['product', 'price', 'calories'])
print(df)
TEXT 📖 للعرض فقط
> **Output:** Run this in a local Python environment (pandas 2.x). The Piston server does not have pandas pre-installed — install it locally (`pip install pandas`) to follow along. Actual values may vary slightly depending on your pandas version.

(3) من قائمة قواميس

▶ مثال: إنشاء إطار بيانات من قائمة قواميس (الصعوبة ⭐)

TEXT 📖 للعرض فقط
> **Output:** Run this in a local Python environment (pandas 2.x). The Piston server does not have pandas pre-installed — install it locally (`pip install pandas`) to follow along. Actual values may vary slightly depending on your pandas version.
PYTHON
import pandas as pd

# List of dicts: each dict = one row
data = [
    {'product': 'Coffee', 'price': 4.50, 'calories': 5},
    {'product': 'Tea', 'price': 3.80, 'calories': 2},
    {'product': 'Juice', 'price': 5.20, 'calories': 120}
]
df = pd.DataFrame(data)
print(df)
# Missing keys become NaN
data2 = [
    {'product': 'Coffee', 'price': 4.50},
    {'product': 'Tea', 'calories': 2}
]
df2 = pd.DataFrame(data2)
print(df2)
#   product  price  calories
# 0  Coffee   4.50       NaN
# 1     Tea    NaN       2.0
TEXT 📖 للعرض فقط
> **Output:** Run this in a local Python environment (pandas 2.x). The Piston server does not have pandas pre-installed — install it locally (`pip install pandas`) to follow along. Actual values may vary slightly depending on your pandas version.

(4) من مصفوفة NumPy ndarray

▶ مثال: إنشاء إطار بيانات من مصفوفة ndarray (الصعوبة ⭐)

TEXT 📖 للعرض فقط
> **Output:** Run this in a local Python environment (pandas 2.x). The Piston server does not have pandas pre-installed — install it locally (`pip install pandas`) to follow along. Actual values may vary slightly depending on your pandas version.
PYTHON
import numpy as np
import pandas as pd

arr = np.random.randn(4, 3)  # 4 rows, 3 columns of random numbers
df = pd.DataFrame(arr, columns=['A', 'B', 'C'])
print(df.shape)   # (4, 3)
print(df.dtypes)  # all float64
TEXT 📖 للعرض فقط
> **Output:** Run this in a local Python environment (pandas 2.x). The Piston server does not have pandas pre-installed — install it locally (`pip install pandas`) to follow along. Actual values may vary slightly depending on your pandas version.

(5) مقارنة طرق الإنشاء

الطريقة الصيغة السمات حالة الاستخدام
قاموس pd.DataFrame({'col': [data]}) موجه بالعمود، الأكثر طبيعية الأكثر شيوعاً
قائمة قوائم pd.DataFrame([[r1c1, ...], ...]) موجه بالصف بناء صف بصف
قائمة قواميس pd.DataFrame([{'col': val, ...}, ...]) موجه بالصف، المفاتيح المفقودة تصبح NaN تلقائياً بيانات API/JSON
مصفوفة ndarray pd.DataFrame(np.array(...)) بيانات متجانسة تحويل بيانات NumPy
read_csv pd.read_csv('file.csv') تحميل من ملف الأكثر شيوعاً في المشاريع الحقيقية


5. فحص واستكشاف البيانات

(1) معاينة سريعة: head / tail / sample

▶ مثال: معاينة إطار بيانات (الصعوبة ⭐)

TEXT 📖 للعرض فقط
> **Output:** Run this in a local Python environment (pandas 2.x). The Piston server does not have pandas pre-installed — install it locally (`pip install pandas`) to follow along. Actual values may vary slightly depending on your pandas version.
PYTHON
import pandas as pd

df = pd.DataFrame({
    'name': ['Laptop', 'Phone', 'Tablet', 'Monitor', 'Keyboard',
             'Mouse', 'Headset', 'Speaker', 'Camera', 'Charger'],
    'price': [999.99, 699.99, 349.99, 449.99, 79.99,
              29.99, 149.99, 89.99, 599.99, 19.99],
    'stock': [50, 120, 80, 35, 200, 300, 150, 180, 25, 500]
})

print(df.head())      # first 5 rows
print(df.head(3))     # first 3 rows
print(df.tail(2))     # last 2 rows
print(df.sample(3))   # random 3 rows (for inspection)
TEXT 📖 للعرض فقط
> **Output:** Run this in a local Python environment (pandas 2.x). The Piston server does not have pandas pre-installed — install it locally (`pip install pandas`) to follow along. Actual values may vary slightly depending on your pandas version.

(2) نظرة عامة على البيانات: info

▶ مثال: طريقة info بالتفصيل (الصعوبة ⭐⭐)

TEXT 📖 للعرض فقط
> **Output:** Run this in a local Python environment (pandas 2.x). The Piston server does not have pandas pre-installed — install it locally (`pip install pandas`) to follow along. Actual values may vary slightly depending on your pandas version.
PYTHON
import pandas as pd
import numpy as np

df = pd.DataFrame({
    'name': ['Alice', 'Bob', 'Charlie', 'Carol', 'David'],
    'age': [28, 34, 25, 30, 45],
    'salary': [75000.0, 92000.0, np.nan, 88000.0, 105000.0],
    'department': ['Sales', 'Engineering', 'Marketing', 'Sales', 'Management']
})

df.info()
# <class 'pandas.core.frame.DataFrame'>
# RangeIndex: 5 entries, 0 to 4
# Data columns (total 4 columns):
#  #   Column      Non-Null Count  Dtype
# ---  ------      --------------  -----
#  0   name        5 non-null      object
#  1   age         5 non-null      int64
#  2   salary      4 non-null      float64  ← 1 missing value!
#  3   department  5 non-null      object
# dtypes: float64(1), int64(1), object(2)
# memory usage: 288.0+ bytes
TEXT 📖 للعرض فقط
> **Output:** Run this in a local Python environment (pandas 2.x). The Piston server does not have pandas pre-installed — install it locally (`pip install pandas`) to follow along. Actual values may vary slightly depending on your pandas version.

info() هي الخطوة الأولى في تحليل البيانات — تخبرك: عدد الصفوف، نوع بيانات (dtype) لكل عمود، ما إذا كانت هناك قيم مفقودة، واستخدام الذاكرة.

(3) الملخص الإحصائي: describe

▶ مثال: ملخص إحصائي باستخدام describe (الصعوبة ⭐)

TEXT 📖 للعرض فقط
> **Output:** Run this in a local Python environment (pandas 2.x). The Piston server does not have pandas pre-installed — install it locally (`pip install pandas`) to follow along. Actual values may vary slightly depending on your pandas version.
PYTHON
import pandas as pd

df = pd.DataFrame({
    'price': [999.99, 699.99, 349.99, 449.99, 79.99],
    'stock': [50, 120, 80, 35, 200],
    'rating': [4.7, 4.5, 4.3, 4.6, 4.2]
})

# Numeric columns only (default)
print(df.describe())
#           price    stock   rating
# count     5.00     5.00     5.00
# mean    515.79    97.00     4.46
# std     347.31    69.72     0.21
# min      79.99    35.00     4.20
# 25%     349.99    50.00     4.30
# 50%     449.99    80.00     4.50
# 75%     699.99   120.00     4.60
# max     999.99   200.00     4.70

# Include all columns
print(df.describe(include='all'))
TEXT 📖 للعرض فقط
> **Output:** Run this in a local Python environment (pandas 2.x). The Piston server does not have pandas pre-installed — install it locally (`pip install pandas`) to follow along. Actual values may vary slightly depending on your pandas version.
الطريقة ماذا تُظهر حالة الاستخدام
df.head() أول 5 صفوف نظرة سريعة على تنسيق البيانات
df.info() عدد الصفوف / أنواع بيانات الأعمدة / القيم المفقودة / الذاكرة خطوة أولى يجب فحصها
df.describe() ملخص إحصائي للأعمدة الرقمية فهم التوزيع
df.shape (صفوف، أعمدة) أبعاد البيانات
df.dtypes نوع بيانات كل عمود التحقق من الأنواع


6. خصائص DataFrame الأساسية

(1) مرجع سريع للخصائص

الخاصية نوع الإرجاع الوصف مثال
df.shape tuple (صفوف، أعمدة) (5, 4)
df.index Index تسميات الصفوف RangeIndex(0, 5)
df.columns Index أسماء الأعمدة Index(['name', 'age', ...])
df.dtypes Series نوع البيانات لكل عمود name: object, age: int64
df.values ndarray البيانات الأساسية مصفوفة ثنائية الأبعاد
df.ndim int عدد الأبعاد 2
df.size int العدد الإجمالي للعناصر 20 (5 صفوف × 4 أعمدة)
df.T DataFrame التبديل (Transpose) تبديل الصفوف والأعمدة

▶ مثال: نظرة عامة على الخصائص الأساسية (الصعوبة ⭐)

TEXT 📖 للعرض فقط
> **الإخراج:** قم بتشغيل هذا في بيئة Python محلية (pandas 2.x). خادم Piston لا يحتوي على pandas مثبته مسبقاً — قم بتثبيته محلياً (`pip install pandas`) لتتمكن من المتابعة. القيم الفعلية قد تختلف قليلاً حسب إصدار pandas لديك.
PYTHON
import pandas as pd

df = pd.DataFrame({
    'name': ['Alice', 'Bob', 'Charlie'],
    'age': [28, 34, 25],
    'salary': [75000.0, 92000.0, 68000.0]
})

print(f"Shape:    {df.shape}")      # (3, 3)
print(f"Index:    {df.index}")      # RangeIndex(0, 3)
print(f"Columns:  {df.columns}")    # Index(['name', 'age', 'salary'])
print(f"Dtypes:\n{df.dtypes}")
print(f"Size:     {df.size}")       # 9
print(f"Ndim:     {df.ndim}")       # 2
TEXT 📖 للعرض فقط
> **الإخراج:** قم بتشغيل هذا في بيئة Python محلية (pandas 2.x). خادم Piston لا يحتوي على pandas مثبته مسبقاً — قم بتثبيته محلياً (`pip install pandas`) لتتمكن من المتابعة. القيم الفعلية قد تختلف قليلاً حسب إصدار pandas لديك.

(2) تحديد الأعمدة وإضافتها

▶ مثال: عمليات الأعمدة (الصعوبة ⭐)

TEXT 📖 للعرض فقط
> **الإخراج:** قم بتشغيل هذا في بيئة Python محلية (pandas 2.x). خادم Piston لا يحتوي على pandas مثبته مسبقاً — قم بتثبيته محلياً (`pip install pandas`) لتتمكن من المتابعة. القيم الفعلية قد تختلف قليلاً حسب إصدار pandas لديك.
PYTHON
import pandas as pd

df = pd.DataFrame({
    'name': ['Alice', 'Bob', 'Charlie'],
    'age': [28, 34, 25],
    'salary': [75000.0, 92000.0, 68000.0]
})

# تحديد عمود واحد → Series
print(type(df['name']))   # <class 'pandas.core.series.Series'>

# تحديد أعمدة متعددة → DataFrame
print(df[['name', 'salary']])

# إضافة عمود جديد
df['bonus'] = df['salary'] * 0.1
df['level'] = df['age'].apply(lambda x: 'Senior' if x >= 30 else 'Junior')
print(df)
TEXT 📖 للعرض فقط
> **الإخراج:** قم بتشغيل هذا في بيئة Python محلية (pandas 2.x). خادم Piston لا يحتوي على pandas مثبته مسبقاً — قم بتثبيته محلياً (`pip install pandas`) لتتمكن من المتابعة. القيم الفعلية قد تختلف قليلاً حسب إصدار pandas لديك.

(3) التبديل (Transpose)

▶ مثال: تبديل DataFrame (الصعوبة ⭐)

TEXT 📖 للعرض فقط
> **الإخراج:** قم بتشغيل هذا في بيئة Python محلية (pandas 2.x). خادم Piston لا يحتوي على pandas مثبته مسبقاً — قم بتثبيته محلياً (`pip install pandas`) لتتمكن من المتابعة. القيم الفعلية قد تختلف قليلاً حسب إصدار pandas لديك.
PYTHON
import pandas as pd

df = pd.DataFrame({
    'Q1': [320, 280, 350],
    'Q2': [410, 390, 420]
}, index=['Product A', 'Product B', 'Product C'])

print(df.T)
#              Product A  Product B  Product C
# Q1          320        280        350
# Q2          410        390        420
TEXT 📖 للعرض فقط
> **الإخراج:** قم بتشغيل هذا في بيئة Python محلية (pandas 2.x). خادم Piston لا يحتوي على pandas مثبته مسبقاً — قم بتثبيته محلياً (`pip install pandas`) لتتمكن من المتابعة. القيم الفعلية قد تختلف قليلاً حسب إصدار pandas لديك.


7. مثال كامل: جدول منتجات التجارة الإلكترونية من البداية إلى النهاية

▶ مثال: إنشاء واستكشاف بيانات المنتج (الصعوبة ⭐⭐⭐)

TEXT 📖 للعرض فقط
> **الناتج:** قم بتشغيل هذا في بيئة Python محلية (pandas 2.x). خادم Piston لا يحتوي على pandas مثبتة مسبقاً — قم بتثبيتها محلياً (`pip install pandas`) للمتابعة. قد تختلف القيم الفعليّة قليلاً اعتماداً على إصدار pandas لديك.
PYTHON
import pandas as pd
import numpy as np

# ============================================
# مثال شامل: إنشاء واستكشاف جدول
# منتجات التجارة الإلكترونية
# ============================================

# 1. إنشاء إطار البيانات
products = pd.DataFrame({
    'name': ['Laptop', 'Phone', 'Tablet', 'Monitor', 'Keyboard',
             'Mouse', 'Headset', 'Speaker'],
    'category': ['Electronics', 'Electronics', 'Electronics',
                 'Electronics', 'Accessories', 'Accessories',
                 'Accessories', 'Accessories'],
    'price': [999.99, 699.99, 349.99, 449.99, 79.99,
              29.99, 149.99, 89.99],
    'stock': [50, 120, 80, 35, 200, 300, 150, 180],
    'rating': [4.7, 4.5, 4.3, 4.6, 4.2, 4.0, 4.4, 4.1]
})

# 2. نظرة عامة
print("=== نظرة عامة على كتالوج المنتجات ===")
print(f"المنتجات: {len(products)}")
print(f"الفئات: {products['category'].unique().tolist()}")
print(f"الأعمدة: {products.columns.tolist()}")

# 3. أنواع البيانات والذاكرة
print(f"\n=== أنواع البيانات ===")
print(products.dtypes)
print(f"\nاستخدام الذاكرة: {products.memory_usage(deep=True).sum() / 1024:.1f} كيلوبايت")

# 4. إحصائيات سريعة
print(f"\n=== إحصائيات الأسعار ===")
print(products['price'].describe())

# 5. قيمة المخزون لكل منتج
products['inventory_value'] = products['price'] * products['stock']
print(f"\n=== أعلى 3 من حيث قيمة المخزون ===")
print(products.nlargest(3, 'inventory_value')[['name', 'inventory_value']])

# 6. تفصيل حسب الفئة
print(f"\n=== ملخص الفئات ===")
cat_summary = products.groupby('category').agg(
    count=('name', 'count'),
    avg_price=('price', 'mean'),
    total_stock=('stock', 'sum')
)
print(cat_summary)
TEXT 📖 للعرض فقط
> **الناتج:** قم بتشغيل هذا في بيئة Python محلية (pandas 2.x). خادم Piston لا يحتوي على pandas مثبتة مسبقاً — قم بتثبيتها محلياً (`pip install pandas`) للمتابعة. قد تختلف القيم الفعليّة قليلاً اعتماداً على إصدار pandas لديك.

الناتج المتوقع (مقتطف):

TEXT 📖 للعرض فقط
=== نظرة عامة على كتالوج المنتجات ===
المنتجات: 8
الفئات: ['Electronics', 'Accessories']
الأعمدة: ['name', 'category', 'price', 'stock', 'rating']

=== إحصائيات الأسعار ===
count       8.00
mean      349.99
std       339.32
min        29.99
max       999.99

=== أعلى 3 من حيث قيمة المخزون ===
      name  inventory_value
0   Laptop         49999.50
1    Phone         83998.80
3  Monitor         15749.65

=== ملخص الفئات ===
              count  avg_price  total_stock
category
Accessories       4      87.24          830
Electronics       4     624.99          285

❓ أسئلة شائعة

س ما هي العلاقة بين DataFrame و Series؟
ج DataFrame هو مجموعة مرتبة من السلسلات (Series) — كل عمود هو سلسلة (Series)، وجميع الأعمدة تشارك نفس فهرس الصفوف. اختيار عمود واحد يُرجع سلسلة (Series)؛ اختيار أعمدة متعددة يُرجع DataFrame. اختيار صف واحد يُرجع أيضًا سلسلة (Series) (مع أسماء الأعمدة كفهرس).
س هل يمكن الوصول إلى الأعمدة عبر الفهرس العددي؟
ج نعم. إذا كانت أسماء الأعمدة أعدادًا صحيحة (مثل 0, 1, 2)، فإن استخدام df[0] غامض — يتعامل Pandas معه كاسم عمود، وليس كموضع. في هذه الحالة، استخدم df.iloc[:, 0] للوصول الوضعي أو df.loc[:, 0] للوصول القائم على التسميات. يُفضل استخدام أسماء أعمدة نصية لتجنب الالتباس.
س ما الفرق بين info و describe؟
ج يعرض info معلومات هيكلية (عدد الصفوف / أنواع بيانات الأعمدة / القيم المفقودة / الذاكرة)، بينما يعرض describe ملخصًا إحصائيًا (المتوسط / الانحراف المعياري / الأرباعيات / الأدنى-الأعلى). يجيب info على "كيف يبدو البيانات"، ويصف describe على "كيف يتم توزيع القيم". إنهما متكاملان — تحقق من كليهما عند مواجهة مجموعة بيانات لأول مرة.
س كيف أضيف أو أزيل أعمدة؟
ج لإضافة عمود، استخدم df['new_col'] = values (تُضاف في النهاية) أو df.insert(pos, 'new_col', values) (في موضع محدد). لإزالة عمود، استخدم df.drop('col', axis=1) أو del df['col']. يُرجع drop DataFrame جديدًا (الأصلي لا يتغير)، بينما يقوم del بالتعديل مباشرة.
س ماذا يُرجع values؟
ج df.values يُرجع المصفوفة الأساسية NumPy ndarray ثنائية الأبعاد. إذا كان DataFrame يحتوي على أنواع مختلطة (مثل كائن + int64)، فإن نوع بيانات ndarray يُرقى إلى كائن، مما يؤدي إلى فقدان أداء المتجهات. بالنسبة لـ DataFrames الرقمية البحتة، يحتفظ values بنوع البيانات الرقمية.
س كيف أعيد ترتيب DataFrame (transpose)؟
ج استخدم df.T أو df.transpose(). بعد إعادة الترتيب، تصبح الصفوف أعمدة والأعمدة صفوف. ملاحظة: إذا كان DataFrame الأصلي يحتوي على أنواع مختلطة، فإن جميع الأعمدة تصبح من نوع كائن بعد إعادة الترتيب (لأن ndarray تتطلب أنواعًا متجانسة).
س هل يجب استخدام قاموس أو قائمة لإنشاء DataFrame؟
ج القاموس هو النهج الأكثر طبيعية (المفاتيح = أسماء الأعمدة، القيم = بيانات الأعمدة) ويُوصى به للاستخدام اليومي. قائمة القواميس تناسب البناء صفًا بصف (مثل بيانات JSON من واجهة برمجة تطبيقات). تناسب المصفوفة ndarray البيانات الرقمية البحتة. في المشاريع الحقيقية، 80% من الوقت ستستخدم pd.read_csv() للتحميل من ملف.

📖 ملخص


📝 تمارين

  1. أساسي (مستع الصعوبة ⭐): إنشاء جدول طلاب (الاسم / الرياضيات / الإنجليزي / العلوم) باستخدام 3 طرق مختلفة، ثم اطبع المعلومات وصف النتائج.
  2. متوسط (مستع الصعوبة ⭐⭐): إنشاء جدول موظفين مع قيم مفقودة (الاسم / العمر / الراتب / القسم، حيث يوجد 2 إدخالات NaN في الراتب)، ثم: استخدم info للتحقق من القيم المفقودة → حاسب النسبة غير الفارغة لكل عمود → أضف عمود salary_level (الراتب > 80000 يكون "High"، وإلا "Low"، NaN يكون "Unknown").
  3. تحدٍّ (مستع الصعوبة ⭐⭐⭐): بناء DataFrame من قائمة القواميس (5 سجلات، بعض المفاتيح مفقودة)، ثم: تحقق من القيم المفقودة → املأها بالمتوسط/المن للعمود → عد الحقول غير الفارغة لكل صف → أضف عمود completeness (النسبة غير الفارغة)، وأخيرًا أصدر تقرير describe كاملًا.

← Previous: Introduction to Series · Next: The Index System →

Web-Tutorial.com

فريق Web-Tutorial التقني

منصة دروس برمجية يديرها عدة مطورين. كل درس يتم كتابته ومراجعته بواسطة مطورين متخصصين في المجال. نعمل على ضمان دقة وموثوقية المحتوى — إذا لاحظت أي مشكلة، فيرجى إخبارنا.

100%