Pandas & NumPy Academy · درس

مرشّحات isin() وbetween()

حدّد الصفوف التي تكون فيها قيمة العمود ضمن قائمة باستخدام isin()، أو ضمن نطاق رقمي باستخدام between().

الدرس 3 من 413 خطوة

مرشّحات isin() وbetween() درس مجاني في Pandas & NumPy Academy على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Pandas & NumPy Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Pandas & NumPy Academy 4 دروس في المجموع.

نظرة عامة على الطريقة isin()

تتحقق isin() مما إذا كان كل عنصر في Series موجودًا ضمن قائمة (أو مجموعة) معينة من القيم. وتُرجع Series منطقية يمكنك استخدامها مباشرةً لتصفية الصفوف. وهذا أكثر إيجازًا وغالبًا أسرع من تسلسل مقارنات == متعددة باستخدام |.

فمثلًا، بدلًا من (df['country'] == 'USA') | (df['country'] == 'UK')، تكتب df['country'].isin(['USA', 'UK']).

import pandas as pd

df = pd.DataFrame({
    'country': ['USA', 'Germany', 'UK', 'France', 'USA'],
    'sales': [400, 200, 150, 300, 600]
})

# Check membership
mask = df['country'].isin(['USA', 'UK'])
print(mask.tolist())  # [True, False, True, False, True]

result = df[mask]
print(result)
#   country  sales
# 0     USA    400
# 2      UK    150
# 4     USA    600

استخدام isin() مع المجموعات لتحسين السرعة

يمكنك تمرير مجموعة Python بدلًا من قائمة إلى isin(). ويستغرق البحث عن العضوية في المجموعة زمنًا O(1)، فلا يصبح أبطأ مع ازدياد حجم القائمة. ويهم ذلك عندما تحتوي قائمة القيم المسموح بها على آلاف العناصر، إذ تصبح isin() المعتمدة على مجموعة أسرع بكثير من isin() المعتمدة على قائمة.

import pandas as pd

df = pd.DataFrame({
    'sku': ['A001', 'B002', 'A003', 'C004', 'B005'],
    'qty': [10, 5, 3, 8, 12]
})

# Use a set for fast membership check
allowed_skus = {'A001', 'A003', 'B005'}
result = df[df['sku'].isin(allowed_skus)]
print(result)
#     sku  qty
# 0  A001   10
# 2  A003    3
# 4  B005   12

نفي isin() باستخدام ~

ادمج isin() مع المعامل ~ لتصفية الصفوف التي لا يحتوي فيها العمود على القيم المحددة. وهذه أوضح طريقة لاستبعاد قائمة من القيم المحددة، وهي أكثر قابلية للقراءة بكثير من إنشاء سلسلة من مقارنات !=.

import pandas as pd

df = pd.DataFrame({
    'status': ['active', 'cancelled', 'shipped', 'refunded', 'active'],
    'amount': [100, 200, 300, 150, 500]
})

bad_statuses = ['cancelled', 'refunded']
# Keep all rows NOT in the excluded list
result = df[~df['status'].isin(bad_statuses)]
print(result)
#     status  amount
# 0   active     100
# 2  shipped     300
# 4   active     500

استخدام isin() مع عمود من DataFrame بوصفه القائمة

من الحيل المفيدة تمرير القيم من عمود في DataFrame أخرى إلى isin(). وهذا يعادل شبه ربط في SQL: الاحتفاظ بالصفوف في df1 التي يظهر مفتاحها في df2. وبخلاف الدمج الكامل، لا يؤدي ذلك إلى تكرار الصفوف أو إضافة أعمدة أخرى، بل يقتصر على التصفية.

import pandas as pd

orders = pd.DataFrame({
    'order_id': [1, 2, 3, 4, 5],
    'revenue': [100, 200, 300, 400, 500]
})

vip_orders = pd.DataFrame({'order_id': [2, 4]})

# Keep orders whose ID appears in vip_orders
result = orders[orders['order_id'].isin(vip_orders['order_id'])]
print(result)
#    order_id  revenue
# 1         2      200
# 3         4      400

نظرة عامة على الطريقة between()

تُرجع between(left, right) Series منطقية تكون True عندما تقع القيم ضمن النطاق المغلق [left, right] (وهو شامل افتراضيًا). وتحل محل الشروط الثنائية مثل (df['age'] >= 18) & (df['age'] <= 65) باستدعاء واحد واضح.

يتحكم المعامل inclusive في تضمين الحدود: 'both' (افتراضيًا)، أو 'left'، أو 'right'، أو 'neither'.

import pandas as pd

df = pd.DataFrame({
    'age': [15, 22, 35, 67, 45, 8]
})

# Select working-age population
result = df[df['age'].between(18, 65)]
print(result)
#    age
# 1   22
# 2   35
# 4   45

between() مع المعامل inclusive

يُضمَّن الطرفان افتراضيًا في النطاق. يؤدي ضبط inclusive='left' إلى استبعاد الحد الأيمن (وهو مفيد للفواصل نصف المفتوحة مثل فواصل الوقت)، بينما يستبعد inclusive='right' الحد الأيسر، ويستبعد inclusive='neither' الطرفين لإنشاء فترة مفتوحة صارمة.

import pandas as pd

df = pd.DataFrame({'score': [0, 50, 100, 75, 50]})

# Include only scores strictly between 50 and 100
strict = df[df['score'].between(50, 100, inclusive='neither')]
print(strict)
#    score
# 3     75

# Include 50 but not 100
left_closed = df[df['score'].between(50, 100, inclusive='left')]
print(left_closed)
#    score
# 1     50
# 3     75
# 4     50

استخدام between() مع أعمدة التاريخ

تعمل between() مع أعمدة التاريخ والوقت أيضًا. مرّر سلاسل تواريخ أو كائنات Timestamp بوصفها حدودًا، وستجري Pandas المقارنة على قيم التاريخ والوقت الأساسية. وهذه طريقة واضحة لتحديد نافذة زمنية من دون تحويل التواريخ إلى أعداد صحيحة.

import pandas as pd

df = pd.DataFrame({
    'date': pd.to_datetime(['2024-01-01', '2024-06-15', '2024-11-20', '2025-03-01']),
    'value': [10, 20, 30, 40]
})

# Filter rows in the year 2024
result = df[df['date'].between('2024-01-01', '2024-12-31')]
print(result)
#         date  value
# 0 2024-01-01     10
# 1 2024-06-15     20
# 2 2024-11-20     30

دمج isin() وbetween()

يمكنك دمج isin() وbetween() في التعبير المنطقي نفسه باستخدام & و|. وينشئ ذلك عوامل تصفية موجزة وقابلة للقراءة كانت ستتطلب خلاف ذلك شروطًا متداخلة عديدة. احرص دائمًا على وضع كل استدعاء بين قوسين عند الدمج.

import pandas as pd

df = pd.DataFrame({
    'region': ['North', 'South', 'East', 'North', 'West'],
    'revenue': [100, 500, 200, 300, 400]
})

# Rows in North or South regions AND revenue between 200 and 400
result = df[
    df['region'].isin(['North', 'South']) &
    df['revenue'].between(200, 400)
]
print(result)
#    region  revenue
# 3   North      300
# 1   South      500  <- actually excluded (500 > 400)
# 3   North      300

استخدام isin() مع عدة أعمدة وAny

عندما تريد التحقق مما إذا كان أي عمود من عدة أعمدة يحتوي على قيمة من قائمة، يمكنك استدعاء isin() على DataFrame بأكملها، ثم استخدام .any(axis=1) لدمج النتيجة حسب الصفوف. ويفيد ذلك في البحث في عدة أعمدة للوسوم أو الفئات في الوقت نفسه.

import pandas as pd

df = pd.DataFrame({
    'tag1': ['python', 'java', 'sql'],
    'tag2': ['sql', 'python', 'go'],
    'topic': ['Database', 'Backend', 'Infra']
})

target_langs = ['python', 'sql']
# Check if either tag column matches
mask = df[['tag1', 'tag2']].isin(target_langs).any(axis=1)
result = df[mask]
print(result)
#      tag1    tag2     topic
# 0  python     sql  Database
# 1    java  python   Backend
# 2     sql      go     Infra

نصيحة للأداء: isin() مقابل عدة مقارنات ==

بالنسبة إلى قائمة صغيرة تضم قيمتين أو ثلاثًا، يكون الفرق بين isin() وشروط == المتسلسلة ضئيلًا. أما مع القوائم الكبيرة (المئات من القيم)، فتكون isin() أسرع بكثير لأنها تحوّل القائمة داخليًا إلى مجموعة تجزئة وتجري عمليات بحث بزمن O(1) لكل عنصر بدلًا من المقارنة التسلسلية.

فضّل دائمًا isin() على سلسلة طويلة من شروط | للحصول على شيفرة أنظف وأداء أفضل.

import pandas as pd
import numpy as np

# 1 million row DataFrame
df = pd.DataFrame({'id': np.random.randint(0, 10000, size=1_000_000)})

allowed = list(range(0, 500))  # 500 allowed IDs

# isin() is the right approach here — fast hash lookup
result = df[df['id'].isin(allowed)]
print(result.shape)  # around (50000, 1)

عامل تصفية واقعي: كتالوج المنتجات

إليك مثالًا واقعيًا يدمج isin() لتصفية الفئات وbetween() لتصفية نطاق الأسعار، وهو نمط شائع في تحليلات التجارة الإلكترونية. يحدد عاملا التصفية معًا مجموعة المنتجات المطلوبة تمامًا لحملة ترويجية مستهدفة.

import pandas as pd

products = pd.DataFrame({
    'name': ['Laptop', 'Mouse', 'Monitor', 'Keyboard', 'Webcam'],
    'category': ['Computing', 'Accessories', 'Displays', 'Accessories', 'Peripherals'],
    'price': [1200, 25, 300, 80, 150]
})

# Products in Accessories or Peripherals, priced 50-200
eligible = products[
    products['category'].isin(['Accessories', 'Peripherals']) &
    products['price'].between(50, 200)
]
print(eligible)
#        name     category  price
# 3  Keyboard  Accessories     80
# 4    Webcam  Peripherals    150

تحقق سريع

اختبر مدى فهمك لعوامل التصفية isin() وbetween().

مراجعة الدرس

تعلّمت في هذا الدرس أن: isin() تتحقق من العضوية في مجموعة وتكون أسرع من تسلسل شروط == متعددة؛ وأن ~isin() تستبعد قائمة من القيم؛ وأن between() تصفي نطاقًا مغلقًا باستخدام المعامل inclusive الاختياري. وتعمل الطريقتان مع الأعمدة الرقمية والنصية وأعمدة التاريخ والوقت. بعد ذلك سنستكشف كيفية تحديد أعمدة DataFrame التي تطابق نمطًا معينًا في الاسم.

البدء مجانًا

تعلم Python مع معلم ذكاء اصطناعي — مجانًا

اكتب وقم بتشغيل أكوادك الفعلية في المتصفح، واحصل على مساعدة فورية من معلم ذكاء اصطناعي متاح 24/7، واستمر من حيث توقفت على الويب أو في التطبيق.

الدورات
30
الدروس
120

الأسئلة الشائعة

هل درس «مرشّحات isin() وbetween()» مجاني؟

نعم — نص درس «مرشّحات isin() وbetween()» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Pandas & NumPy Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Pandas & NumPy Academy 4 دروس في المجموع.

ماذا ستتعلم في «مرشّحات isin() وbetween()»؟

حدّد الصفوف التي تكون فيها قيمة العمود ضمن قائمة باستخدام isin()، أو ضمن نطاق رقمي باستخدام between(). تتمرن على Pandas & NumPy Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Pandas & NumPy Academy؟

لا تُشترط خبرة سابقة. Pandas & NumPy Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.

كم من الوقت يستغرق درس «مرشّحات isin() وbetween()»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Pandas & NumPy Academy هذا؟

نعم. كل درس في Pandas & NumPy Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. الفهرسة المنطقية في DataFrames
  2. الدالة query()
  3. مرشّحات isin() وbetween()
  4. تحديد الأعمدة حسب النمط
← العودة إلى Pandas & NumPy Academy