مرشّحات isin() وbetween()
حدّد الصفوف التي تكون فيها قيمة العمود ضمن قائمة باستخدام isin()، أو ضمن نطاق رقمي باستخدام between().
مرشّحات 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 45between() مع المعامل 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 يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- الفهرسة المنطقية في DataFrames
- الدالة query()
- مرشّحات isin() وbetween()
- تحديد الأعمدة حسب النمط