Pandas: اختيار البيانات

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

يُعدُّ اختيار البيانات العمليّة الأكثر تكرارًا في تحليل البيانات—"أرني البيانات التي تحقّق هذه الشروط." تقدّم Pandas مجموعة غنيّة من أساليب الاختيار: حسب التسمية، حسب الموضع، حسب الشرط، حسب التعبير، وحتى سلاسل الاستعلام المشابهة لـ SQL. يأخذك هذا القسم عبر كل أسلوب اختيار ويساعدك على تجنّب فخّ "فهرسة السلاسل" الأكثر شيوعًا.

⚠️ ملاحظة: يجب تشغيل الشيفرة أدناه في بيئة Python محلية.

1. What You Will Learn


2. احتياجات تشارلي لتصفية المنتجات

(1) نقطة الألم: الجمع بين شروط متعددة أمر متعب للغاية

يحتاج تشارلي إلى تصفية "منتجات إلكترونية بسعر أكبر من 50 وتقييم أكبر من 4.0" من بين 1000 منتج. قام أولاً بكتابة سلسلة طويلة من الشروط باستخدام الفهرسة المنطقية:

PYTHON
import pandas as pd

df = pd.DataFrame({
    'name': ['Laptop', 'Phone', 'Tablet', 'Monitor', 'Keyboard',
             'Mouse', 'Headset', 'Speaker', 'Camera', 'Charger'],
    'category': ['Electronics', 'Electronics', 'Electronics', 'Electronics',
                 'Accessories', 'Accessories', 'Accessories', 'Accessories',
                 'Electronics', 'Accessories'],
    '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],
    'rating': [4.7, 4.5, 4.3, 4.6, 4.2, 4.0, 4.4, 4.1, 4.8, 3.9]
})

# الفهرسة المنطقية — تعمل ولكنها مطولة
result = df[(df['price'] > 50) & (df['rating'] > 4.0) & (df['category'] == 'Electronics')]
print(result[['name', 'price', 'rating']])
#       name    price  rating
# 0   Laptop   999.99     4.7
# 1    Phone   699.99     4.5
# 2   Tablet   349.99     4.3
# 3  Monitor   449.99     4.6
# 8   Camera   599.99     4.8
TEXT 📖 للعرض فقط
> **المخرجات:** شغّل هذا في بيئة بايثون محلية (pandas 2.x). خادم Piston لا يحتوي على مكتبة pandas مثبتة مسبقًا، لذا يرجى تثبيتها على جهازك (`pip install pandas`) واتباع النص. قد تختلف القيم الفعلية قليلاً حسب إصدار pandas.

(2) الحل: طريقة الاستعلام (query) أكثر وضوحًا للقراءة

▶ مثال

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

: استعلامات قابلة للقراءة باستخدام query (الصعوبة ⭐⭐)

PYTHON
# نفس النتيجة، أكثر وضوحًا للقراءة بكثير
result = df.query('price > 50 and rating > 4.0 and category == "Electronics"')
print(result[['name', 'price', 'rating']])

# باستخدام متغير
min_price = 50
min_rating = 4.0
result2 = df.query('price > @min_price and rating > @min_rating')
TEXT 📖 للعرض فقط
> **المخرجات:** شغّل هذا في بيئة بايثون محلية (pandas 2.x). خادم Piston لا يحتوي على مكتبة pandas مثبتة مسبقًا، لذا يرجى تثبيتها على جهازك (`pip install pandas`) واتباع النص. قد تختلف القيم الفعلية قليلاً حسب إصدار pandas.

(3) الفائدة: أربع طرق للاختيار، لكل منها نقاط قوتها

الطريقة بنية الجملة الأفضل لـ
loc df.loc[row, col] التحديد الدقيق باستخدام العلامات (Labels)
iloc df.iloc[r, c] التحديد بناءً على الموضع
الفهرسة المنطقية df[condition] الشروط البسيطة
query df.query('expr') تصفية شروط متعددة ومعقدة

3. loc: تحديد بالاسم (Label Selection)

(1) بنية loc (loc Syntax)

df.loc[صف_الاسم، عمود_الاسم] — يحدد بناءً على الاسم؛ والتقطيعات تشمل النقطة النهائية.

▶ مثال

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

: تحديد بالاسم باستخدام loc (الصعوبة ⭐)

PYTHON
import pandas as pd

df = pd.DataFrame({
    'name': ['Laptop', 'Phone', 'Tablet', 'Monitor', 'Keyboard'],
    'price': [999.99, 699.99, 349.99, 449.99, 79.99],
    'stock': [50, 120, 80, 35, 200]
}, index=['A001', 'A002', 'A003', 'A004', 'A005'])

# صف واحد حسب الاسم
print(df.loc['A001'])
# name      Laptop
# price     999.99
# stock         50

# عدة صفوف
print(df.loc[['A001', 'A003']])

# قطع الصفوف + قطع الأعمدة (بالأسماء، يشمل النقطة النهاية)
print(df.loc['A001':'A003', 'name':'price'])
#          name    price
# A001   Laptop   999.99
# A002    Phone   699.99
# A003   Tablet   349.99

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

(2) تحديد شرطي باستخدام loc

▶ مثال

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

: loc + شرط (الصعوبة ⭐⭐)

PYTHON
import pandas as pd

df = pd.DataFrame({
    'name': ['Laptop', 'Phone', 'Tablet', 'Monitor', 'Keyboard'],
    'price': [999.99, 699.99, 349.99, 449.99, 79.99],
    'stock': [50, 120, 80, 35, 200]
})

# تصفية الصفوف + تحديد الأعمدة في عملية واحدة
expensive = df.loc[df['price'] > 400, ['name', 'price']]
print(expensive)
#       name    price
# 0   Laptop   999.99
# 1    Phone   699.99
# 3  Monitor   449.99

# مع الإسناد (آمن — بدون تعديد فهرس متسلسل)
df.loc[df['stock'] < 50, 'stock'] = 50  # إعادة تخزين العناصر منخفضة المخزون
TEXT 📖 للعرض فقط
> **المخرجات:** شغّل هذا في بيئة بايثون محلية (pandas 2.x). خادم Piston لا يحتوي على pandas مثبتًا مسبقًا، لذا يرجى تثبيته على جهازك (`pip install pandas`) والمتابعة. قد تختلف القيم الفعلية قليلاً اعتمادًا على إصدار pandas.

4. iloc: التحديد حسب الموقع

(1) صيغة iloc

df.iloc[row_pos, col_pos] — يحدد الصفوف والأعمدة حسب الموقع العددي (الموضع الصحيح)؛ الشرائح لا تشمل النقطة النهائية (أسلوب بايثون).

▶ مثال

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

: تحديد الموضع باستخدام iloc (الصعوبة ⭐)

PYTHON
import pandas as pd

df = pd.DataFrame({
    'name': ['Laptop', 'Phone', 'Tablet', 'Monitor', 'Keyboard'],
    'price': [999.99, 699.99, 349.99, 449.99, 79.99],
    'stock': [50, 120, 80, 35, 200]
})

# صف واحد حسب الموضع
print(df.iloc[0])      # الصف الأول (Laptop)

# عدة صفوف حسب قائمة المواضع
print(df.iloc[[0, 2, 4]])

# شريحة صف + شريحة عمود (مواقع، لا تشمل النقطة النهائية)
print(df.iloc[0:3, 0:2])
#      name    price
# 0  Laptop   999.99
# 1   Phone   699.99
# 2  Tablet   349.99

# آخر صفّين
print(df.iloc[-2:])

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

(2) الاختلافات الرئيسية بين loc و iloc

الميزة loc iloc
أساس الفهرس التسمية الموقع العددي (الموضع الصحيح)
نقطة نهاية الشريحة يشمل النقطة النهائية لا يشمل النقطة النهائية
تسميات نصية
فهارس سالبة
التصفية الشرطية
السيناريو الموصى به عندما تعرف الاسم عندما تعرف الموضع
🔥 خطأ شائع: df.loc[0:3] يشمل الصفوف 0,1,2,3 (4 صفوف)، بينما df.iloc[0:3] يشمل الصفوف 0,1,2 (3 صفوف). هذا هو أكثر نقطة خلط شائعة بين loc و iloc.


5. التصفية الشرطية (الفهرسة المنطقية)

(1) الشروط المفردة والمتعددة

▶ مثال

TEXT 📖 للعرض فقط
> **الخرج:** قم بتشغيل هذا في بيئة بايثون محلية (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[df['price'] > 400])

# شروط متعددة: & (و)، | (أو)، ~ (ليس)
# يجب استخدام الأقواس حول كل شرط!
high_price_good_rating = df[(df['price'] > 400) & (df['rating'] >= 4.5)]
print(high_price_good_rating[['name', 'price', 'rating']])

# شرط "أو"
hot_items = df[(df['price'] > 500) | (df['stock'] > 100)]
print(hot_items[['name', 'price', 'stock']])

# شرط "ليس"
not_electronics = df[~(df['category'] == 'Electronics')]
print(not_electronics)
TEXT 📖 للعرض فقط
> **الخرج:** قم بتشغيل هذا في بيئة بايثون محلية (pandas 2.x). خادم Piston لا يحتوي على pandas مثبتة مسبقاً، لذا يرجى تثبيتها على جهازك (`pip install pandas`) والمتابعة. القيم الفعلية قد تختلف قليلاً اعتماداً على إصدار pandas.
⚠️ ملاحظة: عند دمج شروط متعددة، يجب استخدام & / | / ~، وليس and / or / not. يجب وضع كل شرط داخل أقواس، وإلا فإن أولوية العاملين ستسبب خطأ.

(2) الشروط النصية

▶ مثال

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

: تصفية الشروط النصية (الصعوبة ⭐)

PYTHON
import pandas as pd

df = pd.DataFrame({
    'name': ['Wireless Mouse', 'USB Keyboard', 'Bluetooth Headset',
             'Wireless Speaker', 'USB Camera'],
    'price': [29.99, 79.99, 149.99, 89.99, 599.99]
})

# يحتوي على نص فرعي
wireless = df[df['name'].str.contains('Wireless')]
print(wireless)

# يبدأ بـ
usb = df[df['name'].str.startswith('USB')]
print(usb)
TEXT 📖 للعرض فقط
> **الخرج:** قم بتشغيل هذا في بيئة بايثون محلية (pandas 2.x). خادم Piston لا يحتوي على pandas مثبتة مسبقاً، لذا يرجى تثبيتها على جهازك (`pip install pandas`) والمتابعة. القيم الفعلية قد تختلف قليلاً اعتماداً على إصدار pandas.

6. طريقة الاستعلام

(1) الصيغة الأساسية

df.query('expression') — تصفية الصفوف باستخدام تعبير نصي، مما يوفر سهولة في القراءة أقرب إلى SQL.

▶ مثال

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]
})

# Simple condition
print(df.query('price > 400'))

# Multiple conditions (and/or instead of &/|)
print(df.query('price > 400 and rating >= 4.5'))

# String comparison
print(df.query('category == "Electronics"'))

# Use @ to reference Python variables
threshold = 100
print(df.query('stock > @threshold'))

# Column names with spaces (backtick)
# df.query('`unit price` > 100')
TEXT 📖 للعرض فقط
> **الإخراج:** قم بتشغيل هذا في بيئة Python محلية (pandas 2.x). خادم Piston لا يحتوي على pandas مثبتًا مسبقًا، لذا يرجى تثبيته على جهازك (`pip install pandas`) والالتزام بالخطوات. قد تختلف القيم الفعليّة قليلاً حسب إصدار pandas.

(2) الاستعلام مقابل الفهرسة المنطقية

الميزة الفهرسة المنطقية الاستعلام
الصيغة df[(df.a>1) & (df.b<2)] df.query('a>1 and b<2')
سهولة القراءة أقواس متداخلة قريب من SQL
مرجع المتغير يُستخدم مباشرة يتطلب بادئة @
أسماء الأعمدة مع مسافات لا مشكلة يتطلب علامات اقتباس خلفية
الأداء أبطأ قليلاً (بيانات كبيرة) أسرع قليلاً (محرك محسّن)
المرونة الأعلى محدود بصيغة التعبير

7. تصفية isin

(1) تطابق القيم المتعددة

▶ مثال

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

: تصفية isin للقيم المتعددة (الصعوبة ⭐)

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]
})

# التصفية حسب عدة قيم للفئة
target_cats = ['Electronics', 'Audio']
# ملاحظة: الصوت غير موجود في البيانات → لا يوجد تطابق، لا يوجد خطأ
result = df[df['category'].isin(target_cats)]
print(result[['name', 'category']])

# النفي: ليس في القائمة
other = df[~df['category'].isin(['Electronics'])]
print(other)
# فقط Accessories

# isin مع قيم رقمية
target_prices = [999.99, 79.99]
print(df[df['price'].isin(target_prices)])
# Laptop و Keyboard
TEXT 📖 للعرض فقط
> **الإخراج:** شغّل هذا في بيئة Python محلية (pandas 2.x). خادم Piston لا يحتوي على pandas مُثبَّتًا مسبقًا، لذا يرجى تثبيته على جهازك (`pip install pandas`) والمتابعة. قد تختلف القيم الفعلي قليلاً حسب إصدار pandas.

(2) isin مقابل == للقيم المتعددة

الطريقة الصيغة حالة الاستخدام
isin df[col].isin([v1,v2,v3]) تطابق القيم المتعددة
== df[col] == v1 تطابق قيمة واحدة
| تركيب (df[col]==v1) | (df[col]==v2) بضعة قيم متعددة
query df.query('col in ["v1","v2"]') تطابق قيم متعددة للقراءة

8. فخ الفهرسة المتسلسلة

(1) ما هي الفهرسة المتسلسلة

▶ مثال

TEXT 📖 للعرض فقط
> **Output:** Run this in a local Python environment (pandas 2.x). The Piston server does not have pandas preinstalled, so please install it on your machine (`pip install pandas`) and follow along. Actual values may vary slightly depending on the pandas version.

: الخطر الخفي للفهرسة المتسلسلة (الصعوبة ⭐⭐)

PYTHON
import pandas as pd

df = pd.DataFrame({
    'name': ['Laptop', 'Phone', 'Tablet'],
    'price': [999.99, 699.99, 349.99],
    'category': ['Electronics', 'Electronics', 'Electronics']
})

# ❌ فهرسة متسلسلة — قد تطلق SettingWithCopyWarning
# df[df['price'] > 400]['price'] = 0  # غير متوقع!

# ✅ عملية واحدة باستخدام loc
df.loc[df['price'] > 400, 'price'] = 0  # تعمل دائمًا

# ❌ شكل متسلسل آخر
# df[df['category'] == 'Electronics']['stock'] = 100

# ✅ النهج الصحيح
df.loc[df['category'] == 'Electronics', 'stock'] = 100
TEXT 📖 للعرض فقط
> **Output:** Run this in a local Python environment (pandas 2.x). The Piston server does not have pandas preinstalled, so please install it on your machine (`pip install pandas`) and follow along. Actual values may vary slightly depending on the pandas version.
🔥 خطأ شائع: الفهرسة المتسلسلة df[condition][col] = value قد لا تعدّل DataFrame الأصلي (النتيجة الوسيطة هي نسخة). الطريقة الصحيحة للكتابة هي: df.loc[condition, col] = value—عملية واحدة تحدد الصفوف والأعمدة مرة واحدة.

(2) شجرة قرار التحديد الآمن

100%
graph TB
    Q["Need to select data?"] -->|"Read only"| LOC["loc / iloc / boolean"]
    Q -->|"Read + Assign"| SAFE["loc[row_cond, col] = value"]
    Q -->|"Complex filter"| QUERY["query()"]
    Q -->|"Multi-value match"| ISIN["isin()"]
    SAFE --> WARN["❌ Never: df[cond][col] = val"]
TEXT 📖 للعرض فقط
> **Output:** Run this in a local Python environment (pandas 2.x). The Piston server does not have pandas preinstalled, so please install it on your machine (`pip install pandas`) and follow along. Actual values may vary slightly depending on the pandas version.

9. مثال كامل: تصفية المنتجات متعددة الأبعاد للتجارة الإلكترونية

▶ مثال

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

: سير عمل تصفية المنتج الكامل (الصعوبة ⭐⭐⭐)

PYTHON
import pandas as pd
import numpy as np

# ============================================
# مثال شامل: سير عمل اختيار منتجات التجارة الإلكترونية
# متعددة الأبعاد
# ============================================

# 1. إنشاء كتالوج المنتجات
np.random.seed(42)
df = pd.DataFrame({
    'name': [f'Product_{i:03d}' for i in range(1, 51)],
    'category': np.random.choice(['Electronics', 'Clothing', 'Home', 'Sports'], 50),
    'price': np.round(np.random.uniform(10, 500, 50), 2),
    'stock': np.random.randint(0, 300, 50),
    'rating': np.round(np.random.uniform(3.0, 5.0, 50), 1),
    'brand': np.random.choice(['Alpha', 'Beta', 'Gamma', 'Delta'], 50)
})

# 2. loc: اختيار دقيق
print("=== الإلكترونيات بسعر > 200 ===")
elec_expensive = df.loc[
    (df['category'] == 'Electronics') & (df['price'] > 200),
    ['name', 'price', 'rating']
]
print(elec_expensive.head())

# 3. iloc: اختيار بناءً على الموقع
print("\n=== أول 3 صفوف، أول 4 أعمدة ===")
print(df.iloc[:3, :4])

# 4. Boolean: شروط متعددة
print("\n=== تقييم عالٍ، متوفر في المخزون، أقل من 100 دولار ===")
bargains = df[(df['rating'] >= 4.5) & (df['stock'] > 0) & (df['price'] < 100)]
print(bargains[['name', 'price', 'rating', 'stock']])

# 5. query: فلتر معقد وقابل للقراءة
print("\n=== منتجات Alpha إلكترونيات أو منزلي، تقييم >= 4.0 ===")
query_result = df.query(
    'brand == "Alpha" and category in ["Electronics", "Home"] and rating >= 4.0'
)
print(query_result[['name', 'category', 'rating']])

# 6. isin: فلتر متعدد القيم
print("\n=== العلامات التجارية المحددة ===")
top_brands = df[df['brand'].isin(['Alpha', 'Beta'])]
print(f"منتجات Alpha + Beta: {len(top_brands)}")

# 7. تعيين آمن
df.loc[df['stock'] == 0, 'status'] = 'Out of Stock'
df.loc[df['stock'] > 0, 'status'] = 'In Stock'
print(f"\n=== حالة المخزون ===")
print(df['status'].value_counts())
TEXT 📖 للعرض فقط
> **الإخراج:** قم بتشغيل هذا في بيئة Python محلية (pandas 2.x). لا يحتوي خادم Pandas على pandas مثبتًا مسبقًا، لذا يرجى تثبيته على جهازك (`pip install pandas`) واتباع الخطوات. قد تختلف القيم الفعلية قليًّا حسب إصدار pandas.

❓ أسئلة شائعة

س ما الفرق بين loc و iloc؟
ج loc يختار حسب التسمية (اسم الصف/اسم العمود)، وتشمل الشرائح النقطة النهائية. أما iloc فيختار حسب الموقع العددي، وتستثني الشرائح النقطة النهائية (أسلوب بايثون). استخدم loc عندما تعرف الاسم، وiloc عندما تعرف الموقع. عندما يكون الفهرس هو الفهرس الافتراضي RangeIndex(0,1,2...)، فإن loc[0] و iloc[0] يعيدان نفس النتيجة، لكن دلالتهما تختلف.
س لماذا تحتاج الفلاتر الشرطية إلى أقواس؟
ج في بايثون، لدى عوامل التشغيل & / | / ~ أولوية أعلى من عوامل المقارنة. يتم تحليل df['a'] > 1 & df['b'] < 2 كـ df['a'] > (1 & df['b']) < 2، مما يسبب خطأ. يجب كتابة (df['a'] > 1) & (df['b'] < 2). لا يمكنك استخدام and/or/not - فهي لا تدعم العمليات العنصرية على مستوى المصفوفة.
س ما هي مشكلة الفهرسة المتسلسلة؟
ج df[condition][col] = value هما عمليتان منفصلتان: الأولى قد تعيد إما عرضًا (view) أو نسخة (copy)، والتخصيص للنسخة في الخطوة الثانية لن يؤثر على DataFrame الأصلي. يؤدي هذا إلى خطأ خفي وهو "لقد غيرته لكنه لم يتحقق". الطريقة الصحيحة للكتابة هي: df.loc[condition, col] = value، وهي عملية واحدة تحدد كلًا من الصفوف والأعمدة دفعة واحدة.
س هل query يدعم المتغيرات؟
ج نعم. استخدم @ للإشارة إلى المتغيرات الخارجية: df.query('price > @min_price'). لأسماء الأعمدة التي تحتوي على مسافات، استخدم علامات الاقتباس الخلفية: df.query('unit price > 100'). داخل query، تدعم الكلمات المفتاحية مثل and/or/not/in، مما يجعلها أقرب إلى اللغة الطبيعية.
س ما الفرق بين isin و == ؟
ج == يمكنها مطابقة قيمة واحدة فقط، بينما isin يمكنها مطابقة عدة قيم دفعة واحدة. df[col].isin([v1,v2,v3]) تعادل (df[col]==v1) | (df[col]==v2) | (df[col]==v3)، لكنها أكثر إيجازًا وكفاءة. استخدم ~df[col].isin(...) عندما تحتاج إلى النفي.
س ما هي مزالق التخصيص بعد الاختيار؟
ج أكبر مزلقة هي الفهرسة المتسلسلة (انظر السؤال رقم 3). مزلقة أخرى هي أن df[df.a > 0] = 1 تضبط الصف بالكامل إلى 1 (وليس العمود a فقط). الشكل الصحيح هو: df.loc[df.a > 0, 'a'] = 1. استخدم دائمًا loc لتحديد شرط الصف والعمود المستهدف في وقت واحد.
س لماذا تشمل شريحة loc النقطة النهائية؟
ج هذا خيار تصميمي من Pandas—عند التقطيع حسب التسمية، تعني النقطة النهائية "من التسمية A إلى التسمية B"، وتضمين كليهما أكثر بديهية ( تمامًا مثل نطاق المفتاح في القاموس). التقطيع حسب الموقع مع iloc يتبع اتفاقية بايثون (استبعاد النقطة النهائية). تذكر: loc تعني "دلالات التسمية"، و iloc تعني "دلالات بايثون".

📖 ملخص


📝 تمارين

  1. أساسي (صعوبة ⭐): أنشئ إطار بيانات طلابي (الاسم / الرياضيات / الإنجليزية / العلوم). استخدم loc لتحديد أعمدة الاسم والرياضيات للطلاب الذين الرياضيات > 80، واستخدم iloc لتحديد أول 3 صفوف.
  2. متوسط (صعوبة ⭐⭐): قم بتصفية البيانات نفسها بـ 3 طرق (فهرسة منطقية / استعلام / isin): السعر بين 50 و 200، والفئة هي إلكترونيات أو منزلي. قارن كمية الكود وسهولة القراءة.
  3. تحدي (صعوبة ⭐⭐⭐): أنشئ إطار بيانات منتجات بـ 50 صفًا وأكمل 5 تمارين اختيار: صف واحد من loc / شريحة iloc / منطق متعدد الشروط / متغير مع query / قيم متعددة مع isin. بعد كل اختيار، قم بتعيين عمود علامة جديد باستخدام loc بأمان، وأخيرًا احسب عدد كل علامة.

← Previous Lesson: Data Types · Next Lesson: Data I/O →

Web-Tutorial.com

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

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

100%