برمجة بايثونتحليل البيانات الإحصائيةعلم البيانات

كيفية استخدام عامل التصفية NOT IN في بانداس (مع أمثلة)

دليل أكاديمي شامل يشرح كيفية تطبيق عامل التصفية NOT IN في مكتبة بانداس (Pandas) بلغة بايثون باستخدام عامل النفي المنطقي ودالة isin مع أمثلة عملية مفصلة.

Mohammed looti أكاديمي وباحث متخصص في علم النفس
تاريخ النشر
تمت المراجعة العلمية · د. مروة عبد العظيم · 16 سبتمبر، 2026
مراجعة وتدقيق علمي معتمد تاريخ التدقيق: 16 سبتمبر، 2026
د. مروة عبد العظيم دكتوراه
أستاذة علم النفس جامعة كربلاء
معايير التدقيق والاعتماد السريري

يخضع هذا المحتوى لمعايير ضبط الجودة والتدقيق العلمي والأكاديمي الصارمة في شبكة علم النفس العربي، لضمان صحة المعلومات ودقتها السريرية ومطابقتها لأحدث الأدلة والبراهين الصادرة عن الجمعيات النفسية والطبية المعتمدة (APA / WHO).

تعتبر معالجة البيانات وتنقيتها ركيزة أساسية لا غنى عنها في دورة حياة علم البيانات وهندسة التحليلات المتقدمة. فعند التعامل مع مجموعات البيانات الكبيرة والواقعية، نادراً ما تأتي السجلات في صورة مثالية تلبي متطلبات النمذجة الرياضية أو التحليل الإحصائي المباشر؛ بل غالباً ما تحتوي على شوائب، ومدخلات شاذة، وفئات مستهدفة بالاستبعاد لعدم مطابقتها لفرضيات الدراسة أو لأهداف العمل التجارية. في هذا السياق، تبرز مكتبة بانداس (Pandas) كأداة معيارية فائقة القوة في بيئة لغة بايثون (Python)، موفرة ترسانة برمجية واسعة للتحكم في هياكل البيانات الجدولية مثل إطارات البيانات (DataFrames) والسلاسل (Series). وتعد عمليات التصفية الشرطية (Conditional Filtering) بمثابة العمود الفقري لهذه الترسانة، حيث تحدد بدقة متناهية العينات التي يُسمح لها بالمرور إلى مراحل التحليل اللاحقة.

وعلى الرغم من وضوح وسهولة العمليات الإيجابية التي تهدف إلى انتقاء السجلات المطابقة لمجموعة محددة من المعايير، فإن التحدي الفعلي والمنهجي يظهر جلياً عند الحاجة إلى تنفيذ عمليات “الاستبعاد المنطقي” أو ما يُعرف في لغة الاستعلامات البنيوية باسم تصفية “NOT IN”. ففي العديد من السيناريوهات العملية، يكون من الأيسر والأكثر إحكاماً تحديد ما يجب استبعاده بدلاً من محاولة حصر كافة القيم المقبولة، خاصة إذا كانت الفئات المستهدفة بالاحتفاظ ديناميكية أو لا نهائية التنوع. غير أن مكتبة بانداس لا تتضمن دالة صريحة تحمل الاسم البرمجي المباشر لعامل الاستبعاد، مما يفرض على مهندسي ومحللي البيانات فهم الآليات الجبرية والمنطقية الكامنة وراء الفهرسة البوليانية واستخدام عامل التلدة لتنفيذ هذا الاستبعاد بكفاءة قصوى ودقة متناهية.

يهدف هذا الدليل المرجعي الشامل إلى سبر أغوار عامل التصفية NOT IN في مكتبة بانداس، بدءاً من تفكيك بنيته النحوية والرياضية، وصولاً إلى استعراض أبعاده التطبيقية المعقدة في تنقية البيانات النصية، والرقمية، ومتعددة المؤشرات. سنغوص عميقاً في تقييم الفروق الجوهرية بين الأنماط البرمجية المختلفة كالفهرسة البوليانية وطريقة الاستعلام، مع تقديم تحليل حسابي معمق للأداء الزمني واستهلاك الذاكرة، مدعوماً بحالات دراسية واقعية وأفضل الممارسات المتبعة في البيئات الإنتاجية عالية الاعتمادية.

1. مقدمة شاملة حول تصفية البيانات في مكتبة بانداس وأهمية الاستبعاد المنطقي

1.1 أهمية استخراج البيانات الجزئية وتنقية مجموعات البيانات

تمثل مرحلة استخراج البيانات الجزئية (Subsetting) وتنقية مجموعات البيانات خطوة تمهيدية حاسمة في خطوط أنابيب معالجة البيانات الضخمة (Data Pipelines) والتحليل الإحصائي الرصين. فعندما تتدفق البيانات من مصادر متعددة كقواعد البيانات المعاملاتية، وواجهات برمجة التطبيقات، وسجلات خوادم الويب، ومستشعرات إنترنت الأشياء، فإنها تحمل معها حتماً قدراً كبيراً من الضجيج الإحصائي والمعلومات غير ذات الصلة بالسياق التحليلي الراهن. ويعد الانتقاء الشرطي وسيلة رياضية وبرمجية لعزل العينات غير المرغوب فيها من إطار البيانات، مما يضمن أن النماذج التنبؤية واختبارات الفرضيات لا تُبنى إلا على ركائز صلبة وممثلة تمثيلاً دقيقاً لمجتمع الدراسة المستهدف.

تتضاعف أهمية هذه العملية عند مواجهة التحديات المنهجية المرتبطة بالتحكم في المتغيرات الشاذة أو الفئات المستبعدة؛ ففي المسوح الديموغرافية أو التجارب السريرية، قد يتطلب بروتوكول البحث استبعاد فئات عمرية معينة، أو مناطق جغرافية لم تكتمل فيها معايير جمع العينات، أو حتى رموز خطأ تجريبية تكررت أثناء القياس. إن الفشل في تنقية هذه الفئات لا يؤدي فحسب إلى انحراف النتائج وظهور معاملات ارتباط مضللة، بل قد يترتب عليه اتخاذ قرارات استراتيجية خاطئة تماماً بناءً على مخرجات مشوهة لا تعكس الواقع التشغيلي أو الظاهرة الطبيعية الخاضعة للدراسة.

علاوة على ذلك، يمتد تأثير كفاءة التصفية البرمجية ليشمل الجوانب الحاسوبية والهندسية الحيوية، وأبرزها استهلاك الذاكرة العشوائية (RAM) وسرعة تنفيذ الخوارزميات. ففي بيئات الحوسبة السحابية ومجموعات البيانات التي تتجاوز ملايين السجلات، يساهم التقليص المبكر لحجم إطار البيانات عبر استبعاد الصفوف غير الضرورية في تقليل العبء على المعالج، وتفادي أخطاء نفاد الذاكرة، وخفض زمن تدريب نماذج التعلم الآلي بشكل ملحوظ. ومن هنا تبرز الحاجة إلى توظيف خوارزميات تصفية تتسم بالكفاءة الحسابية العالية وتتكامل بسلاسة مع البنية التحتية لمكتبة بانداس المعززة بلغة السي ونمباي.

1.2 مفهوم عامل التصفية NOT IN في سياق لغات قواعد البيانات وبايثون

في لغة الاستعلامات البنيوية (SQL)، يُعد عامل التصفية NOT IN مفهوماً أصيلاً وشائع الاستخدام، حيث يتيح لمهندس البيانات صياغة استعلامات واضحة تنص على استرجاع كافة السجلات التي لا تنتمي قيم عمود معين فيها إلى مجموعة محددة من القيم، مثل صياغة جمل شرطية تستبعد حالات معينة من الطلبات التجارية. وتتميز هذه الصياغة في قواعد البيانات بكونها تعبيرية ومقروءة بصورة فورية، حيث يفهم محرك قاعدة البيانات القصد الدلالي ويترجمه إلى خطة استعلام تنفيذية تقوم بمسح الفهارس بكفاءة عالية لاستبعاد العناصر المحددة.

وعلى النقيض من ذلك، يلاحظ المبرمجون والمحللون القادمون من بيئة قواعد البيانات غياب دالة صريحة تحمل اسم not_in ضمن الواجهة البرمجية لمكتبة بانداس. هذا الغياب ليس نقصاً وظيفياً، بل هو انعكاس لفلسفة التصميم المتجه (Vectorized Operations) المعتمدة داخل المكتبة وبيئة بايثون العلمية عموماً؛ حيث تعتمد بانداس على تجزئة العمليات المعقدة إلى لبنات بنائية أبسط، يمكن دمجها منطقياً لتوفير مرونة غير محدودة. فبدلاً من تقديم مئات الدوال المتخصصة لحالات الاستبعاد المختلفة، توفر المكتبة دالة البحث الموجب عبر المتجهات، وتتيح للمطور قلب النتائج باستخدام مشغلات المنطق البولياني الرياضي.

تتجلى قوة هذه الفلسفة في التكامل السلس بين المصفوفات المنطقية الثنائية (Boolean Arrays) وفهارس إطارات البيانات. فعندما نطبق شرطاً معيناً، يُنتج محرك بانداس سلسلة أحادية البعد مكونة من قيم الصواب والخطأ، تطابق تماماً في طولها وترتيبها فهرس إطار البيانات الأصلي. ويتم تطبيق هذا “القناع” المنطقي على البيانات لاستخلاص السجلات الموافقة لقيم الصواب فقط. وبالتالي، يصبح مفهوم عامل التصفية NOT IN في بانداس عملية مركبة تجمع بين دالة التحقق من الانتماء وعامل النفي المنطقي، محققة نفس النتيجة الوظيفية المنشودة في قواعد البيانات ولكن بمرونة برمجية فائقة تتوافق مع بنية مصفوفات نمباي الأساسية.

2. البنية النحوية الأساسية لعامل التصفية NOT IN في بانداس

2.1 تفكيك الصيغة البرمجية القياسية df[~df[‘col’].isin(values)]

تعتبر الصيغة البرمجية df[~df[‘col’].isin(values)] المعيار الذهبي والأكثر شيوعاً لتنفيذ استبعاد القيم في مكتبة بانداس. ولفهم الكيفية التي تعمل بها هذه العبارة بدقة متناهية، يجب تفكيكها تشريحياً إلى مستوياتها الوظيفية الثلاثة. المستوى الأول يتمثل في الدالة الداخلية df[‘col’].isin(values)؛ حيث تقوم هذه الدالة بأخذ مدخلات البحث، سواء كانت قائمة أو مصفوفة، وتمريرها عبر كل عنصر من عناصر السلسلة المحددة، لتعيد سلسلة بوليانية جديدة بنفس طول العمود الأصلي، تحتوي على القيمة المنطقية True إذا كان العنصر موجوداً ضمن القيم المستهدفة، والقيمة المنطقية False إذا لم يكن كذلك.

المستوى الثاني هو التدخل المحوري لعامل التلدة (~)، وهو في الأصل عامل نفي على مستوى البتات (Bitwise NOT Operator) في لغة بايثون. عند وضعه مباشرة قبل تعبير الدالة isin()، يقوم بعكس كل قيمة منطقية داخل السلسلة البوليانية المتولدة بصورة متجهية وفورية؛ فتتحول كل قيمة True (أي مطابقة للقائمة المراد استبعادها) إلى False، وتتحول كل قيمة False (أي غير موجودة في القائمة المراد استبعادها وبالتالي يُراد الاحتفاظ بها) إلى True. هذه العملية المعكوسة تُنشئ ما يُعرف تقنياً باسم القناع المنطقي المنعكس (Inverted Boolean Mask)، والذي يعبر بدقة متناهية عن شرط الاستبعاد المطلوب.

أما المستوى الثالث والأخير، فيتمثل في إحاطة القناع المعكوس بأقواس الفهرسة المربعة التابعة لإطار البيانات الأصلي df[…]. يقوم محرك بانداس في هذه المرحلة بقراءة القناع المنطقي صَفّاً بصف؛ فيستبقي فقط الصفوف التي يقابلها المؤشر المنطقي True في القناع، بينما يُسقط تماماً وبشكل فعال كافة الصفوف التي تحمل المؤشر False. ولضمان تنفيذ هذه العملية بنجاح وبدون أخطاء برمجية، يتعين على المطور التحقق الدقيق من صحة كتابة اسم العمود المستهدف ومطابقته لحالة الأحرف، فضلاً عن التأكد من أن مدخل القيم values هو كائن قابل للتكرار والتمرير السليم عبر محرك المقارنة الداخلي.

2.2 أنواع الهياكل البيانية المدعومة كقوائم للقيم المستبعدة

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

وعلى الرغم من شيوع القوائم، فإن استخدام المجموعات في بايثون (Sets) يُعد خياراً هندسياً فائق التفوق عند التعامل مع مجموعات ضخمة من القيم المستبعدة التي قد تصل إلى آلاف العناصر. تعتمد المجموعات رياضياً على جداول التجزئة (Hash Tables)، مما يجعل التحقق من وجود العنصر داخل المجموعة عملية ذات تعقيد زمني يقترب من النمط اللحظي الموحد O(1)، مقارنة بالقوائم التي تتطلب بحثاً خطياً O(N) في بعض المسارات؛ مما ينعكس إيجابياً وبصورة ملحوظة على سرعة تقييم الدالة isin() عند تطبيقها على ملايين الصفوف في مجموعات البيانات الكبيرة.

بالإضافة إلى القوائم والمجموعات، تدعم دالة isin() بصورة كاملة السلاسل التابعة لبانداس (Series) والمصفوفات أحادية البعد من مكتبة نمباي (NumPy Arrays)، وهو ما يسهل تمرير أعمدة مشتقة من إطارات بيانات أخرى كمعايير للاستبعاد دون الحاجة إلى تحويلها أولاً إلى قوائم قياسية. وفي حالات متقدمة، يمكن استخدام القواميس (Dictionaries) كمدخلات للدالة؛ حيث تتيح هذه التقنية تعريف شروط استبعاد دقيقة ومتزامنة تغطي عدة أعمدة في آن واحد، حيث يمثل المفتاح اسم العمود وتمثل القيمة قائمة العناصر المراد استبعادها من ذلك العمود بالتحديد، مما يتيح بناء منظومات تصفية هيكلية معقدة بأقل قدر من الشيفرات البرمجية المتكررة.

3. آلية عمل عامل التلدة (~) كعامل نفي منطقي في بيئة بايثون

3.1 الأساس النظري لعمليات النفي على مستوى المصفوفات المنطقية

لفهم الأساس النظري لعمليات النفي في بانداس، يجب التمييز الدقيق بين عامل النفي اللفظي not المستخدم في منطق بايثون القياسي، وعامل النفي المتجه المتمثل في رمز التلدة (~). في لغة بايثون، صُممت الكلمة المفتاحية not لتقييم الحقيقة المنطقية لكائن برمجي مفرد أو لتعبير وحيد يعيد قيمة بوليانية واحدة؛ وإذا حاول المبرمج استخدام not أمام سلسلة بانداس أو مصفوفة نمباي، سيفشل المترجم على الفور وسيطلق خطأ التقييم الغامض (ValueError: The truth value of a Series is ambiguous)، وذلك لأن الكلمة المفتاحية لا تعرف كيف تختزل مصفوفة تحتوي على آلاف القيم البوليانية في قرار حتمي واحد يحدد الصواب من الخطأ.

هنا يأتي دور عامل التلدة (~)، الذي صُمم تاريخياً كعامل نفي على مستوى البتات (Bitwise Inversion)، حيث يقوم بقلب كل بت من صفر إلى واحد والعكس صحيح. وفي سياق هياكل البيانات المنطقية في بانداس ونمباي، تم تحميل هذا العامل بمعانٍ وظيفية متقدمة (Operator Overloading) ليقوم بالنفي العنصري المتجه (Element-wise Vectorized Inversion)؛ فعند تطبيقه على مصفوفة بوليانية، يتم تمريره عبر خطوط الأنابيب الحوسبية منخفضة المستوى في المعالج، ليقوم بقلب كل عنصر منطقي True إلى False، وكل عنصر False إلى True بشكل متزامن ومتوازٍ، دون الحاجة إلى استخدام حلقات التكرار البطيئة مثل for loops.

تخضع هذه العمليات لقواعد الأولويات الحسابية في لغة بايثون، حيث يحظى عامل التلدة بأولوية تنفيذية مرتفعة تفوق في كثير من الأحيان العمليات المنطقية والعلائقية الأخرى. هذا السلوك الحسابي يجعل استخدام الأقواس التنظيمية حول التعبيرات الشرطية أمراً إلزامياً وليس مجرد خيار تجميلي؛ فإذا لم يتم إحاطة التعبير الشرطي بأقواس محكمة قبل تصدير التلدة أمامه، قد يحاول المعالج قلب نوع المتغير أو محتواه قبل تقييم دالة المقارنة، مما يوقع المطور في أخطاء نحوية صعبة التتبع. إن إدارة مصفوفات الأقنعة (Masks) تتطلب فهماً عميقاً للجبر البولياني لضمان أن النفي يقع على ناتج المقارنة الكلي وليس على أجزاء فرعية غير متوافقة برمجياً.

3.2 توليد سلاسل الفهارس المنطقية وتحليل مخرجاتها

لتكوين رؤية تحليلية معمقة حول ما يحدث خلف الكواليس أثناء تطبيق عامل التصفية NOT IN، يُنصح دوماً بفحص مخرجات التعبير البرمجي المنطقي بمعزل عن الفهرسة المباشرة. فعند كتابة الأمر المنفصل mask = ~df[‘col’].isin(values)، ينتج كائن برمجي مستقل ينتمي إلى فئة سلاسل بانداس (pd.Series)، ولكنه يتميز بامتلاكه لنوع البيانات المنطقي المزدوج (boolean dtype). هذا الكائن يحافظ بدقة على نفس قيم الفهرس (Index) الخاص بإطار البيانات الأصلي، مما يجعله مرآة منطقية ترتبط بنيوياً ببيانات الجدول المستهدف.

يلعب نوع البيانات المنطقي دوراً بالغ الأهمية في ترشيد استخدام الذاكرة؛ حيث تُخزن القيم المنطقية في مصفوفات مدمجة ومحسنة للغاية داخل نمباي وبانداس، مما يجعل العمليات التي تُجرى عليها سريعة بصورة فائقة مقارنة بالعمليات على النصوص أو الكائنات العامة. ومن خلال تحليل هذه السلسلة المتولدة، يمكن للمحلل استخدام دوال الفحص الإحصائي السريع مثل mask.value_counts() لمعرفة عدد الصفوف التي ستجتاز عملية التصفية بنجاح وتلك التي سيتم استبعادها، وذلك قبل الإقدام على تعديل أو إنشاء إطارات بيانات جديدة قد تستهلك قدراً كبيراً من الذاكرة التشغيلية.

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

4. تطبيق تصفية NOT IN على البيانات الفئوية والنصية

4.1 استبعاد فئات محددة من عمود نصي فردي مع أمثلة عملية

تمثل البيانات النصية والفئوية الغالبية العظمى من المتغيرات التي يطبق عليها عامل التصفية NOT IN في التطبيقات العملية، لا سيما في مجالات تحليلات الأعمال، والتسويق الرقمي، والتحليلات المؤسسية. ولتوضيح هذا السياق، دعونا نتأمل نموذجاً تطبيقياً يتمثل في إطار بيانات يحتوي على سجلات عملاء تجاريين، تتضمن معرفاتهم، والمدن التي يقطنونها، وفئات اشتراكاتهم الشهرية. قد تتطلب خطة العمل التسويقية تركيز التحليل على كافة العملاء باستثناء المقيمين في مدن معينة تُجرى فيها حملات تجريبية منفصلة ومستقلة تماماً.

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

ولتفادي مثل هذه الأخطاء الكارثية، تقتضي أفضل الممارسات المنهجية توحيد الحالة النصية للعمود وللقائمة المستبعدة معاً قبل التصفية، مثل تحويل النصوص كافة إلى حروف صغيرة، أو إزالة التشكيل والزوائد في النصوص العربية. بالإضافة إلى ذلك، تمثل الفراغات الخفية، سواء كانت بادئة أو لاحقة للنص، فخاً برمجياً شائعاً؛ حيث إن وجود مسافة واحدة في نهاية اسم الفئة في إطار البيانات يجعلها مختلفة جذرياً عن القيمة المطابقة المعرفة في قائمة الاستبعاد. ومن هنا ينبغي دوماً تطبيق دالة تطهير النصوص df[‘col’].str.strip() قبل تمرير القناع المنطقي لضمان دقة الاستبعاد وتطابق السلاسل النصية بنسبة مئة بالمئة.

4.2 التعامل مع السلاسل النصية المعقدة والأنماط التعبيرية

في كثير من الحالات الواقعية، لا يكون الاستبعاد المنطقي محصوراً في مطابقة قيم نصية كاملة وثابتة، بل يمتد ليشمل استبعاد السجلات بناءً على مقاطع جزئية أو أنماط تعبيرية معقدة (Regular Expressions). على سبيل المثال، قد يحتاج المحلل إلى استبعاد كافة عناوين البريد الإلكتروني التي تنتمي إلى نطاقات داخلية تجريبية تنتهي بنطاق معين، أو استبعاد المعاملات المالية التي تبدأ رموزها المرجعية ببادئة خاصة تشير إلى عمليات ملغاة أو تدريبية.

في مثل هذه السيناريوهات، تصبح دالة isin() بمفردها غير كافية، نظراً لكونها تعتمد على التطابق الدقيق والكامل للقيم؛ ويتحول البديل المنهجي الأقوى إلى دمج عامل التلدة (~) مع دالة البحث النصي الجزئي المتجهة df[‘col’].str.contains(). تتيح هذه الدالة تقييم احتواء النصوص على مقطع معين أو نمط ريجكس منتظم، لتعيد مصفوفة بوليانية تشير إلى وجود المقطع من عدمه. وعند تصدير عامل التلدة أمام هذا التعبير بالكامل، يتم قلب المنطق البرمجي فوراً ليتحقق استبعاد كل نص يحتوي على ذلك المقطع الفرعي بصورة متجهية وسريعة.

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

5. تطبيق تصفية NOT IN على المتغيرات الرقمية والقياسات الإحصائية

5.1 استبعاد قيم عددية صحيحة وعشرية محددة

لا يقتصر استخدام عامل التصفية NOT IN على البيانات الفئوية والنصية، بل يمتد ليشكل أداة أساسية لتنقية المتغيرات الرقمية والقياسات الإحصائية والكمية. ففي دراسات العلوم الحيوية والقياسات الهندسية، غالباً ما تستخدم أنظمة جمع البيانات أكواداً رقمية دلالية محددة تشير إلى أخطاء استشعارية أو انقطاع في الإشارة، مثل استخدام الأرقام السالبة (-999 أو -1) للتعبير عن أعطال القياس، أو استخدام أكواد تعريفية ثابتة للدلالة على حسابات مصرفية مخصصة للاختبارات الداخلية ويجب عزلها تماماً عن تقارير الإيرادات الفعلية.

عند تطبيق عامل التصفية df[~df[‘numeric_col’].isin(excluded_numbers)]، يتم عزل هذه الأكواد بسهولة وسرعة متناهية. ولكن عند الانتقال من الأعداد الصحيحة إلى الأعداد العشرية ذات الفاصلة العائمة (Floating-point precision)، تبرز إشكالية حاسوبية دقيقة ترتبط بطريقة تخزين الأرقام الكسرية في الذاكرة وفق معيار IEEE 754. فالمقارنة الحسابية المباشرة للأرقام العشرية عبر دالة isin() قد تفشل بشكل غير متوقع نتيجة لأخطاء التقريب البسيطة جداً في الكسور المتناهية الصغر؛ فإذا كان الرقم المسجل في إطار البيانات هو ناتج عملية حسابية معقدة، قد يختلف عن الرقم المكتوب في قائمة الاستبعاد بفارق ضئيل جداً، مما يؤدي إلى عدم اعتباره مطابقاً وبالتالي فشل استبعاده.

يتطلب هذا السلوك الحسابي التحقق الصارم من تناسق الأنواع البيانية قبل الشروع في التصفية؛ فمن الضروري التأكد من أن نوع العمود الرقمي متطابق بنيوياً مع مدخلات القائمة المستبعدة (مثل عدم مقارنة أرقام ممثلة كنصوص داخل القائمة مع عمود رقمي من نوع int64). وفي حالات الأرقام العشرية الحساسة، قد يكون من الحكمة منهجياً تقريب الأرقام إلى عدد ثابت من المنازل العشرية باستخدام دالة round() قبل إجراء عملية الاستبعاد، أو استبدال المقارنة النقطية بمقارنات نطاقية تستبعد المجالات التي تقع فيها تلك القيم لتجنب فخاخ الفواصل العائمة في بايثون.

5.2 الاستبعاد عبر مجالات رقمية وفترات متقطعة

في كثير من التطبيقات الإحصائية والقياسات النفسية (Psychometrics)، لا تكون القيم المستبعدة مقتصرة على أرقام مفردة متفرقة، بل تتكون من متتاليات رقمية كاملة أو فترات متقطعة تمثل درجات معيارية غير مؤهلة للتحليل. على سبيل المثال، في المسوح السيكومترية التي تعتمد مقاييس ليكرت الخماسية أو السباعية، قد يقرر الباحث استبعاد درجات معينة تمثل استجابات حيادية أو عشوائية تكررت بنمط معين، أو استبعاد رتب مئينية محددة تقع خارج حدود الموثوقية الإحصائية للاختبار.

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

ومع ذلك، تبرز المفاضلة المنهجية الحاسمة بين استخدام دالة isin() المعكوسة واستخدام العوامل العلائقية المباشرة (مثل الأكبر من > والأصغر من <). فإذا كان الاستبعاد المطلوب يغطي مجالاً رقمياً مستمراً ومتصلاً (مثل استبعاد كافة القيم التي تقع بين 50 و100)، فإن استخدام العوامل العلائقية أو دالة between() بالتزامن مع عامل التلدة يُعد خياراً هندسياً وإحصائياً أكثر كفاءة وصحة؛ لأن دالة isin() تتطلب توليد كافة القيم المتقطعة مسبقاً وتخزينها في الذاكرة، وهو أمر يستحيل عملياً عند التعامل مع أرقام عشرية مستمرة، مما يفرض قصر استخدام isin() على الفترات الرقمية المنفصلة والمتقطعة بطبيعتها.

6. التصفية المتقدمة عبر استبعاد القيم عبر أعمدة متعددة

6.1 الجمع بين شروط الاستبعاد المنطقية المتعددة باستخدام المعاملات المنطقية

تتعقد مهام تنقية البيانات في المشاريع الواقعية لتتجاوز التصفية على مستوى عمود فردي، حيث تتطلب القرارات التحليلية في كثير من الأحيان استبعاد السجلات بناءً على تقاطع معقد من الشروط التي تمتد عبر أعمدة متعددة. في مكتبة بانداس، يتم تنفيذ هذا الربط المعقد باستخدام المعاملات المنطقية على مستوى البتات، وتحديداً معامل العطف المنطقي (&) لتمثيل الواو المنطقية (AND)، ومعامل الفصل المنطقي (|) لتمثيل خيار الاحتمال (OR). ويتطلب الجمع بين هذه المعاملات وعامل التلدة فهماً رياضياً دقيقاً لقواعد الجبر البولياني وقوانين دي مورغان (De Morgan’s Laws).

عند الرغبة في تطبيق شروط استبعاد متزامنة، يجب الانتباه بحذر شديد إلى الأهمية الحرجة لعزل كل شرط بين قوسين مستقلين. ففي لغة بايثون، تتمتع معاملات البتات بأولويات تقييم تختلف عن نظيراتها في الكلمات المنطقية الإنجليزية؛ فإذا كُتب التعبير بدون أقواس مثل ~df[‘A’].isin(list_a) & ~df[‘B’].isin(list_b)، قد يفسر المترجم الربط بين القوائم أو المتغيرات الداخلية قبل تقييم النفي الشامل، مما يطلق أخطاء برمجية فورية أو، وهو الأسوأ، يُنتج مصفوفة ترشيح خاطئة منطقياً دون إظهار أي تحذير برمجي.

يتطلب تحليل جداول الحقيقة المنطقية الناتجة عن دمج التلدة مع المعاملات المتعددة يقظة تحليلية كاملة. فعلى سبيل المثال، استبعاد الصفوف التي تحتوي على قيم معينة في العمود الأول “أو” قيم معينة في العمود الثاني، يتطلب التفكير فيما إذا كان النفي يقع على الرابط المشترك أم على كل طرف مستقل. إن استخدام الصيغة ~(condition_1 | condition_2) يكافئ منطقياً ورياضياً الصيغة (~condition_1) & (~condition_2) وفق قوانين دي مورغان. ويؤدي الخلط بين هذه القواعد المنطقية إلى الوقوع في أخطاء منهجية تؤدي إما إلى استبعاد جائر لبيانات سليمة أو تمرير بيانات كان ينبغي عزلها تماماً عن المعالجة الإحصائية.

6.2 تطبيق التصفية المتقاطعة على مستوى الأزواج والصفوف الكاملة

في حالات متقدمة من معالجة البيانات، قد لا يكون الهدف استبعاد قيم معينة من العمود (أ) بشكل مطلق، ولا قيم معينة من العمود (ب) بشكل مطلق، بل استبعاد “الاقتران المحدد” بين قيم العمودين معاً. على سبيل المثال، في تحليل بيانات التجارة الدولية، قد تكون الدولة (س) مقبولة في التحليل، وتصنيف البضائع (ص) مقبولاً أيضاً، ولكن تدفق البضائع (ص) تحديداً من الدولة (س) يخضع لحظر تجاري ويجب استبعاده دون استبعاد بقية صادرات الدولة (س) أو بقية مصادر البضائع (ص).

يمكن معالجة هذه التصفية المتقاطعة بعدة استراتيجيات هندسية متقدمة في بانداس. الاستراتيجية الأولى تعتمد على تمرير قاموس إلى دالة isin() يربط كل عمود بالقيم المستهدفة، ولكن هذا يطبق شروطاً منفصلة على مستوى الأعمدة وليس تزاوجاً صفياً مباشراً. أما الاستراتيجية الأكثر دقة وإحكاماً لاستبعاد الأزواج والصفوف الكاملة، فهي تعتمد على التصفية باستخدام المؤشرات المتعددة (MultiIndex) أو ما يُعرف باسم التصفية المعتمدة على الصفوف المزدوجة (Tuple-based filtering)؛ حيث يتم دمج العمودين في سلسلة من الأزواج (Tuples) أو تعيينهما كمؤشر مركب لإطار البيانات.

عند استخدام المؤشرات المزدوجة، يمكن تعريف قائمة تحتوي على أزواج القيم المستبعدة وتطبيق دالة isin() مباشرة على كائن المؤشر المركب df.set_index([‘Country’, ‘Product’]).index.isin(excluded_pairs)، ثم تصدير عامل التلدة أمامه لعكس القناع. يضمن هذا الأسلوب التحليلي الراقي عدم المساس بأي صف إلا إذا تطابقت كافة متغيراته المشتركة بدقة مع الزوج المحظور، مما يوفر أعلى درجات الضبط والتحكم المجهري في استبعاد السجلات المعقدة متعددة الأبعاد داخل إطارات البيانات الكبيرة.

7. التعامل مع القيم المفقودة (NaN / Null) أثناء تطبيق NOT IN

7.1 سلوك القيم الفارغة عند تقييم دالة isin() وعامل التلدة

يعد التعامل مع القيم المفقودة، الممثلة برمز NaN (ليس رقماً) أو القيم الفارغة (Nulls)، واحداً من أكثر الجوانب حساسية وإرباكاً عند تطبيق تصفية NOT IN في مكتبة بانداس. يرجع هذا الإرباك إلى السلوك الرياضي الافتراضي المعتمد في دالة isin()؛ فعندما تقارن الدالة عنصراً يحمل القيمة NaN مع قائمة القيم المدخلة للبحث، فإنها تعيد دائماً وبشكل افتراضي القيمة المنطقية False، حتى وإن كانت القائمة المستهدفة تحتوي على قيمة np.nan صريحة، ما لم تتم معالجة ذلك بتوافق هيكلي خاص، نظراً لأن معيار بايثون يعتبر أن NaN لا يساوي رياضياً أي شيء حتى نفسه (NaN != NaN).

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

إن هذا الإدراج الضمني للقيم المفقودة يمثل مصدراً رئيسياً لتشوه الحسابات الإحصائية اللاحقة؛ إذ قد يؤدي وجود قيم فارغة غير متوقعة في العينة المصفاة إلى فشل خوارزميات التعلم الآلي التي لا تقبل المدخلات الفارغة، أو التسبب في انحيازات غير محسوبة عند حساب المتوسطات والانحرافات المعيارية. ومن هنا، يتحتم على المطور الواعي عدم الاكتفاء بتطبيق عامل التلدة بصورة مجردة، بل تبني استراتيجيات استبعاد مزدوجة تستبعد القيم غير المرغوبة والقيم الفارغة معاً بحزم منهجي واضح.

7.2 تقنيات تنظيف ومعالجة البيانات المفقودة المصاحبة للتصفية

لتحقيق أعلى مستويات النقاء والموثوقية في مجموعات البيانات المصفاة، توفر مكتبة بانداس مجموعة من الدوال المتخصصة لفحص واستبعاد القيم المفقودة بالتزامن مع تصفية NOT IN. التقنية الأكثر شيوعاً ومتانة هي الجمع الصريح بين شرط الاستبعاد المنفي ودالة التحقق من الوجود notna()، أو نفي دالة isna()، من خلال صياغة منطقية مجمعة تعتمد على معامل العطف: clean_df = df[~df[‘col’].isin(excluded_values) & df[‘col’].notna()].

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

بدلاً من ذلك، قد تقتضي خطة معالجة البيانات التعامل الاستباقي مع القيم المفقودة قبل الوصول إلى مرحلة التصفية الشرطية، وذلك إما من خلال ملء البيانات المفقودة بقيم افتراضية تعبيرية عبر دالة fillna() (مثل استبدال النصوص الفارغة بعبارة “غير محدد” أو ملء الأرقام بالوسيط الحسابي)، أو التخلص الشامل من السجلات الناقصة في خطوة مستقلة باستخدام دالة dropna(). إن الاختيار بين إبقاء البيانات المفقودة أو استبعادها يجب ألا يُترك للصدف البرمجية الناتجة عن سلوك عامل التلدة، بل يجب أن يكون قراراً إحصائياً واعياً وموثقاً في سجلات التحليل التمهيدي للبيانات.

8. تطبيق تصفية NOT IN باستخدام دالة الاستعلام Query Method

8.1 الصيغة النصية البديلة للتصفية عبر df.query()

بالإضافة إلى أسلوب الفهرسة البوليانية القياسي المعزز بعامل التلدة، تقدم مكتبة بانداس واجهة برمجية نصية شديدة الأناقة والقوة تُعرف باسم دالة الاستعلام df.query(). تتيح هذه الدالة للمطور كتابة الشروط التصفوية بصيغة نصوص استعلامية تشبه إلى حد بعيد التعبيرات الطبيعية ولغة الاستعلامات SQL، حيث تدعم بصورة صريحة ومباشرة عبارة not in دون الحاجة إلى اللجوء لعامل التلدة أو التفكير المعقد في أسبقيات العمليات على مستوى البتات، مثل صياغة الاستعلام: df.query(“col not in @excluded_list”).

تعتمد هذه الصيغة النصية على ميزة الإشارة إلى المتغيرات الخارجية المحددة في بيئة عمل بايثون المحلية أو العامة باستخدام الرمز (@) مسبوقاً باسم المتغير. هذه الخاصية تعزز من ديناميكية الاستعلامات البرمجية، حيث يمكن تعديل محتويات القائمة المستبعدة برمجياً في خطوات سابقة، ثم تمريرها بسلاسة داخل النص التعبيري لدالة الاستعلام. كما تتميز دالة query بقدرتها الفائقة على تحسين مقروئية الشيفرة وسهولة صيانتها في المشاريع البرمجية الكبيرة، حيث تصبح التعبيرات الشرطية الطويلة سهلة الفهم والمراجعة حتى من قبل المحللين الذين لا يمتلكون خلفية عميقة في تفاصيل الفهرسة البوليانية للبانداس.

ومع ذلك، تفرض دالة query قيوداً بنيوية يجب إدراكها بدقة؛ فأبرز التحديات تظهر عند التعامل مع أسماء الأعمدة التي تتضمن مسافات بيضاء أو رموزاً خاصة أو تطابق كلمات محجوزة في لغة بايثون. في مثل هذه الحالات، يفشل المحرك النصي في تفسير اسم العمود بشكل سليم ما لم يتم إحاطته بعلامات الاقتباس المائلة المعكوسة (Backticks)، مثل `Column Name` not in @values. إن مراعاة هذه المحددات النحوية تضمن الاستفادة القصوى من جمالية وبساطة دالة الاستعلام دون التعثر في أخطاء التحليل النصي التي قد توقف تنفيذ خط المعالجة بالكامل.

8.2 مقارنة عملية بين الفهرسة البوليانية وطريقة query

عند المفاضلة الهندسية والعملية بين أسلوب الفهرسة البوليانية df[~df[‘col’].isin(values)] وطريقة الاستعلام df.query()، يتبين أن كلتا الطريقتين تمتلكان نقاط قوة تجعلهما متكاملتين أكثر من كونهما متنافستين. من زاوية وضوح الشيفرة البرمجية وقابليتها للقراءة في المشاريع التشاركية، تتفوق طريقة query بشكل ملحوظ عند التعامل مع سلاسل شرطية طويلة ومتشابكة؛ حيث تُقرأ الشروط كنص وصفي مسترسل يقلل من فوضى الأقواس المعقوفة والمربعة ومعاملات البتات، مما يخفف من احتمالية الأخطاء البشرية أثناء التطوير الجماعي للأنظمة.

أما من زاوية الأداء الحاسوبي وزمن المعالجة واستهلاك الذاكرة، فإن الفهرسة البوليانية المباشرة تتفوق في الغالبية العظمى من السيناريوهات التي تتعامل مع مجموعات بيانات صغيرة إلى متوسطة الحجم. والسبب في ذلك هو أن دالة query تعتمد داخلياً على تحليل النص التعبيري برمجياً (Parsing) ثم تجميعه وتنفيذه باستخدام محرك تعبيرات بايثون أو محرك NumExpr إذا كان مثبتاً في البيئة. هذا التحليل النصي الأولي يفرض حملاً حاسوبياً إضافياً صغيراً (Overhead)، يجعل الفهرسة البوليانية القياسية أسرع زمناً في العمليات الخفيفة والمتكررة.

في المقابل، عندما تبلغ مجموعات البيانات أحجاماً ضخمة جداً تتجاوز مئات الآلاف أو ملايين الصفوف، ويتم تفعيل محرك NumExpr المساعد، تستعيد طريقة query تفوقها الحسابي؛ حيث يقوم المحرك بتنفيذ التقييم المنطقي عبر مسارات ذاكرة تخزين مؤقت متوازية (Cache-friendly evaluation) تتفادى إنشاء مصفوفات بوليانية وسيطة كاملة في الذاكرة العشوائية، مما يقلل من استهلاك الذاكرة الإجمالي ويسرع المعالجة. كما تبرز طريقة query كأداة لا غنى عنها عند الحاجة إلى بناء محركات تصفية ديناميكية، حيث يمكن توليد نصوص الاستعلامات آلياً عبر دمج النصوص بناءً على اختيارات المستخدمين في لوحات التحكم التفاعلية وتطبيقات الويب.

9. مقارنة الأداء الحسابي والكفاءة البرمجية بين الطرق المختلفة

9.1 التقييم الزمني والمكاني لمختلف آليات التصفية

إن تقييم الأداء الحسابي والكفاءة البرمجية لا يقتصر على مجرد ضمان وصول الخوارزمية إلى المخرجات الصحيحة، بل يمتد لقياس الزمن المستغرق والمساحة التخزينية المشغولة في الذاكرة الحية (RAM) أثناء تنفيذ التصفية، خاصة عند معالجة البيانات الضخمة (Big Data). ولإجراء تقييم زمني ومكاني رصين لمختلف آليات التصفية المتكافئة وظيفياً مع NOT IN، يُعتمد عادة على أدوات القياس الدقيقة مثل مكتبة timeit لقياس زمن التنفيذ الميكروي، وأداة memory_profiler لرصد سلوك استهلاك الذاكرة المؤقتة أثناء توليد المصفوفات المنطقية المنعكسة.

تُظهر الاختبارات التجريبية الدقيقة أن اختيار هيكل البيانات الحاضن للقيم المستبعدة يحدث فارقاً زمنياً ملموساً في زمن التنفيذ الكلي. فعند استخدام القوائم المعيارية الطويلة، يرتفع زمن التنفيذ تصاعدياً كلما كبرت قائمة الاستبعاد، نظراً لأن محرك المقارنة يضطر في بعض المسارات إلى فحص تواجد العناصر بأسلوب يتأثر بحجم القائمة. في المقابل، يؤدي تحويل قائمة القيم المستبعدة إلى “مجموعة” (Set) في بايثون أو مصفوفة نمباي متوافقة الأنواع إلى خفض زمن التنفيذ بنسب تتراوح بين عشرين إلى أربعين بالمئة في مجموعات البيانات الكبيرة، بفضل كفاءة خوارزميات التجزئة الرياضية التي تعتمدها المجموعات في البحث والفرز الداخلي.

أما من منظور استهلاك الذاكرة، فإن الفهرسة البوليانية df[~df[‘col’].isin(values)] تتطلب إنشاء مصفوفة بوليانية وسيطة كاملة في الذاكرة، تماثل في طولها عدد صفوف إطار البيانات الأصلي. ورغم أن الذاكرة المخصصة للبيانات المنطقية تعد ضئيلة مقارنة بالسلاسل النصية، إلا أن التعامل مع إطارات بيانات تحوي عشرات الملايين من الصفوف قد يؤدي إلى ذروة استهلاك لحظية قد تسبب اختناقاً في موارد النظام المقيدة. كما تكشف المقارنة مع محركات الحوسبة المتجهة المباشرة في نمباي (NumPy Vectorization) مثل np.isin() مع عامل النفي (~)، أن نمباي توفر أداءً زمنياً أسرع بصورة طفيفة نظراً لتجاوزها طبقات التحقق من صحة الفهارس التي تجريها مكتبة بانداس، وإن كان ذلك يأتي على حساب التخلي عن إدارة الفهارس التلقائية التي تميز بانداس وتجعلها أكثر أماناً وتماسكاً.

9.2 تحسين الأداء في مجموعات البيانات الكبيرة والمتشعبة

لتحقيق أقصى كفاءة تشغيلية وتفادي استنزاف موارد الذاكرة عند تطبيق تصفية NOT IN على مجموعات البيانات المتشعبة والضخمة، يتعين على مهندس البيانات تطبيق حزمة من تقنيات التحسين الهيكلي الاستباقية. تأتي في مقدمة هذه التقنيات استراتيجية تحويل الأعمدة النصية ذات الفئات المتكررة إلى النوع الفئوي المدمج (category dtype). يتيح هذا التحويل لبانداس تخزين النصوص المعقدة كأكواد رقمية صحيحة مقتضبة ترتبط بجدول فئات موحد في الذاكرة، مما يقلل حجم العمود بنسبة قد تصل إلى ثمانين بالمئة، وينعكس بشكل هائل على سرعة تقييم دالة isin()؛ حيث تتم المقارنة المنطقية على الأكواد الصحيحة السريعة بدلاً من مقارنة السلاسل النصية الثقيلة عنصراً بعنصر.

الاستراتيجية الثانية بالغة الأهمية هي الاستفادة المتقدمة من الفهارس وتعيين العمود المستهدف بالتصفية كفهرس رسمي لإطار البيانات (Index). توفر الفهارس في مكتبة بانداس بنى بيانات شجرية وخوارزميات بحث مسبقة الفهرسة، تتيح استبعاد السجلات باستخدام تقنيات مطابقة الفهارس السريعة df.loc[~df.index.isin(values)]، وهي آلية تتفوق في بعض المعماريات على فحص الأعمدة العادية المتكرر، لا سيما إذا كانت البيانات مرتبة تصاعدياً أو تنازلياً وفق ذلك الفهرس، مما يقلص من عدد المقارنات الفعلية المطلوبة لاستبعاد القيم.

علاوة على ذلك، يجب الانتباه بحرص شديد إلى استراتيجيات التصفية الموضعية والحد من التوليد غير الضروري للنسخ المكررة في الذاكرة. ففي لغة بايثون، يؤدي تطبيق التصفية الشرطية تلقائياً إلى إنشاء إطار بيانات جديد تماماً يحجز مساحة مستقلة في الذاكرة العشوائية. ولتفادي تضخم استهلاك الموارد، يمكن للمطور تطبيق التصفية تدريجياً على دفعات (Chunks) إذا كانت البيانات تُقرأ من ملفات خارجية ضخمة كملفات CSV الكبيرة، واستبعاد السجلات غير المرغوبة فور قراءة كل دفعة وقبل دمجها في إطار بيانات نهائي، مما يضمن بقاء استهلاك الذاكرة ثابتاً وضمن الحدود التشغيلية الآمنة لبيئة العمل البرمجية.

10. الأخطاء البرمجية الشائعة عند تطبيق تصفية NOT IN وكيفية تفاديها

10.1 الأخطاء النحوية والمنطقية المتكررة

يقع العديد من المطورين والمحللين، لا سيما في بدايات تعاملهم مع مكتبة بانداس، في شباك مجموعة من الأخطاء النحوية والمنطقية المتكررة التي تعطل خطوط المعالجة أو تقود إلى مخرجات إحصائية غير صحيحة. يأتي على رأس هذه الأخطاء الخلط الشائع بين الكلمة المفتاحية not وعامل التلدة (~). فكما أسلفنا، يؤدي استخدام df[not df[‘col’].isin(values)] إلى إطلاق خطأ فوري يفيد بغموض القيمة الحقيقة للسلسلة، وهو خطأ نابع من محاولة تطبيق منطق بايثون المخصص للمتغيرات الفردية على هياكل مصفوفية متجهة تتطلب مشغلات البتات المنطقية حصراً.

الخطأ النحوي الفادح الثاني يتمثل في إغفال الأقواس التنظيمية حول الشروط المنطقية المترابطة، خاصة عند دمج شروط استبعاد متعددة باستخدام المعاملات (&) أو (|). يؤدي هذا الإهمال إلى قيام مفسر بايثون بتقييم المعاملات وفق أسبقيات غير متوقعة، مما يسفر عن ظهور أخطاء من نوع TypeError تشير إلى تعذر تطبيق العمليات المنطقية بين أنواع بيانية غير متوافقة، أو حدوث خلل منطقي صامت يستبعد صفوفاً كان ينبغي الاحتفاظ بها. والحل المنهجي الدائم هو إحاطة كل شرط بولياني فرعي بأقواس دائرية محكمة ومستقلة: (condition_1) & (~condition_2).

ومن الأخطاء الشائعة أيضاً محاولة استخدام عامل المقارنة التقليدي df[‘col’] != [val1, val2] لاستبعاد قائمة من القيم؛ حيث تفشل هذه المحاولة لأن المقارنة المباشرة لا تفهم مفهوم الاحتواء المتعدد بل تحاول مقارنة كل صف بالقائمة ككائن واحد كامل، مما ينتج عنه سلوك خاطئ تماماً. كذلك يبرز التحذير البرمجي الشهير والمربك SettingWithCopyWarning؛ والذي يظهر عندما يحاول المطور تعديل قيم في إطار البيانات المصفى بعد استخدام التلدة، نتيجة لعدم وضوح ما إذا كان الإطار الناتج مجرد “عرض” (View) للبيانات الأصلية أم “نسخة” حقيقية مستقلة (Copy). ويكمن العلاج المعياري لتفادي هذا التحذير في إلحاق عملية التصفية صراحة بنسخ عميق عبر دالة .copy() لضمان استقلالية البيانات المصفاة في الذاكرة.

10.2 أخطاء التوافق الدلالي وأنواع البيانات

تمثل أخطاء التوافق الدلالي واختلاف الأنواع البيانية تحدياً صامتاً وخطيراً عند تطبيق عامل التصفية NOT IN؛ إذ إنها لا توقف عمل البرنامج ولا تطلق أي استثناءات برمجية واضحة، ولكنها تؤدي إلى فشل عملية الاستبعاد تماماً دون علم المطور. يظهر هذا الخلل بوضوح عندما تتواجد فجوة بين نوع البيانات المخزنة في العمود ونوع البيانات المدخلة في قائمة الاستبعاد، مثل أن يحتوي عمود المعرفات في إطار البيانات على أرقام ممثلة كنصوص strings، في حين يمرر المطور قائمة الاستبعاد في صورة أعداد صحيحة integers [101, 102, 103].

في هذه الحالة، ستفشل دالة isin() في تحقيق أي مطابقة إيجابية، لأن لغة بايثون وبانداس تعتبران أن القيمة النصية ‘101’ لا تساوي بأي حال من الأحوال القيمة العددية 101. ونتيجة لذلك، ستعيد الدالة القيمة False لكافة الصفوف، ليقوم عامل التلدة بقلبها جميعاً إلى True، وتكون النتيجة الصادمة هي احتفاظ إطار البيانات بكافة السجلات التي كان يراد استبعادها دون حذف سجل واحد! ويستدعي تفادي هذه الكارثة التحقق الصارم من خاصية df[‘col’].dtype والتأكد من مطابقتها التامة لنوع عناصر القائمة، مع إمكانية استخدام دالة تحويل الأنواع astype() للمواءمة الاستباقية بين الطرفين.

لا يقل تأثير المسافات الخفية والرموز غير المرئية خطورة عن اختلاف الأنواع؛ فوجود مسافات بادئة أو لاحقة، أو تفاوت في محارف الترميز الموحد (Unicode) مثل الفروق الطفيفة بين أنواع الهمزات والياءات في اللغة العربية أو علامات التشكيل، يؤدي فوراً إلى كسر التطابق الشكلي بين النصوص. للتغلب على هذه المشكلة، يجب تضمين خطوة تدقيق وتطهير أولية للبيانات المرجعية وقيم إطار البيانات معاً عبر تقنيات التنظيف النصي وإزالة المسافات وتطبيع الحروف الموحدة (Unicode Normalization) قبل الشروع في بناء القناع المنطقي المنعكس.

11. حالات دراسية عملية وتطبيقات تطبيقية على مجموعات بيانات واقعية

11.1 تطبيق التصفية في تحليل أداء الفرق واللاعبين الرياضيين

لتجسيد القوة التطبيقية لعامل التصفية NOT IN في سياق عملي واقعي، نتناول حالة دراسية مستمدة من مجال تحليلات الأداء الرياضي (Sports Analytics). لنفترض أننا نمتلك مجموعة بيانات ضخمة لدوري كرة قدم احترافي، تضم سجلات المباريات، وأسماء الأندية المتنافسة، وعدد النقاط المكتسبة، والأهداف المسجلة والمستقبلة، ومؤشرات الأداء التكتيكي المتطورة كالأهداف المتوقعة (xG). تقتضي أهداف الدراسة التحليلية قياس الكفاءة الهجومية العامة للدوري مع استبعاد الفرق التي هبطت رسمياً إلى الدرجة الأدنى في الموسم السابق، والفرق المعاقبة بخصم نقاط أو المنسحبة من المنافسات؛ لكون نتائجها تمثل قيماً شاذة إحصائياً وتؤثر سلباً على سلامة النماذج التنبؤية للبطولة.

تبدأ المعالجة البرمجية بتعريف قائمة الكيانات المستبعدة بدقة تحت مسمى relegated_or_penalized_teams، ثم تمريرها لعزلها عن إطار البيانات الرئيسي باستخدام الصيغة القياسية: analysis_df = df[~df[‘Team’].isin(relegated_or_penalized_teams)].copy(). وبمجرد تنفيذ هذا الاستبعاد المنطقي، يُلاحظ على الفور انخفاض عدد الصفوف الكلي في إطار البيانات، مما يعكس النجاح في تطهير السجلات من التأثيرات غير التنافسية للفرق غير المؤهلة.

عند الشروع في حساب المقاييس الإحصائية الوصفية (Descriptive Statistics)، كالمتوسط الحسابي للأهداف والانحراف المعياري لدرجات الاستحواذ، تبرز الفروق الجوهرية بوضوح؛ حيث يُظهر إطار البيانات بعد التصفية ارتفاعاً في دقة التوزيع الطبيعي واستقراراً أكبر في تباين البيانات، نتيجة للتخلص من الهزائم الثقيلة غير الممثلة التي كانت تمنى بها تلك الفرق المستبعدة. علاوة على ذلك، عند بناء المخططات البيانية وتصور البيانات (Data Visualization)، مثل مخططات التوزيع التكراري ومخططات الصندوق (Box Plots)، يتضح جلياً كيف ساهم عامل التصفية NOT IN في تنقية المعالم البصرية للظاهرة الرياضية، متيحاً للمحللين استخلاص استنتاجات تكتيكية دقيقة وموثوقة تعكس المنافسة الحقيقية بين أندية النخبة.

11.2 تطبيق التصفية في تنقية عينات البحوث النفسية والمسوح الميدانية

الحالة الدراسية الثانية تسلط الضوء على تطبيق عامل التصفية في تنقية عينات البحوث النفسية والمسوح الميدانية الاجتماعية. تتسم مجموعات البيانات الواردة من الاستبيانات الإلكترونية والمسوح الميدانية العامة باحتوائها على نسبة مرتفعة من “الاستجابات غير الجادة” أو غير المؤهلة؛ كأن يقوم المستجيب بالإجابة على استبيان مخصص لفئة الشباب وهو يقع في فئة عمرية غير مستهدفة، أو قيامه باختيار نمط متكرر وثابت من الإجابات للإسراع في إنهاء الاستبيان دون قراءة الأسئلة، أو ظهور رموز استجابة تشير إلى عدم اكتمال البيانات الأساسية في منظومة جمع العينات.

في هذا السياق المنهجي الصارم، يتم توظيف عامل التصفية NOT IN لاستبعاد الفئات العمرية غير المشمولة في نطاق البحث، بالإضافة إلى استبعاد المعرفات الرقمية للمستجيبين الذين أثبتت اختبارات الانتباه (Attention Checks) عدم جديتهم في الإجابة. تُبنى منظومة التصفية هنا بطريقة متعددة الشروط تعزل في آن واحد الفئات غير المستهدفة والاستجابات المشبوهة، مما يضمن أن تقتصر العينة المتبقية على المشاركين المؤهلين علمياً لتمثيل مجتمع البحث.

تلعب هذه التنقية دوراً حاسماً في تعزيز الصدق الداخلي والصدق الخارجي للبحث العلمي؛ إذ تتيح عزل المجموعات الضابطة والتجريبية بدقة متناهية تمهيداً لإجراء اختبارات الفرضيات الإحصائية المتقدمة كتحليل التباين (ANOVA) واختبارات (t-tests). كما تتطلب أخلاقيات ومعايير البحث العلمي الرصين توثيق كافة خطوات الاستبعاد المنطقي في المنهجية البحثية بدقة تامة، مع تسجيل عدد الحالات المستبعدة استناداً إلى كل معيار على حدة، وهو ما يوفره تطبيق عامل التصفية في بانداس بشفافية كاملة وقابلية استثنائية للتكرار وإعادة التحقق (Reproducibility) من قبل مراجعي النظراء والمجتمع العلمي.

12. أفضل الممارسات البرمجية وتوصيات التطوير المستدام لمشاريع تحليل البيانات

12.1 معايير كتابة شيفرات برمجية نظيفة وقابلة للصيانة

إن كتابة شيفرات تصفية البيانات في بيئات العمل الاحترافية والمشاريع البرمجية الممتدة لا تقاس فقط بقدرتها الحالية على العمل، بل بمدى نظافتها وقابليتها للصيانة والتوسع المستقبلي بواسطة فرق العمل المشتركة. وأولى الممارسات الفضلى في هذا الإطار هي تجنب التسميات العشوائية والمبهمة للمتغيرات، والحرص على تسمية القوائم والوسائط بأسماء دلالية واضحة تعكس بوعي “السبب المنهجي” وراء الاستبعاد؛ كأن يُسمى المتغير excluded_fraudulent_accounts أو inactive_subscriber_ids بدلاً من مجرد تسميته lst أو temp.

الممارسة الهندسية الثانية هي تجنب كتابة شروط التصفية المعقدة والمتشابكة في سطر برمجي واحد طويل وغير مقروء؛ إذ يُستحسن دائماً تقسيم عمليات التصفية متعددة الشروط إلى خطوات مرحلية منظمة وموثقة بالتعليقات التوضيحية. يتضمن ذلك إنشاء قناع منطقي مستقل لكل شرط على حدة بمتغير ذي اسم دلالي، ثم دمج هذه الأقنعة معاً في قناع كلي نهائي يتم تطبيقه على إطار البيانات. هذا التقسيم المرحلي يسهل عملية تصحيح الأخطاء (Debugging) ويسمح باختبار وتعديل كل شرط بمفرده دون التأثير على بقية المنظومة التصفوية.

كذلك يُنصح في المشاريع الكبرى ببناء دوال مخصصة وقابلة لإعادة الاستخدام (Reusable Functions) لتنفيذ عمليات التصفية الشائعة والمتكررة عبر وحدات المشروع المختلفة، وتغليفها ضمن خطوط أنابيب معالجة موحدة (Pipelines) باستخدام دالة df.pipe(). ويتكامل ذلك مع التوثيق المنهجي لمعايير تنقية البيانات في تقارير البيانات الوصفية (Metadata)، حيث يتم تسجيل مبررات الاستبعاد، وحجم البيانات المستبعدة، والتواريخ الزمنية للتنفيذ، لضمان استمرارية المعرفة البرمجية داخل المؤسسة وسهولة مراجعتها وتطويرها على المدى الطويل.

12.2 بناء اختبارات التحقق وتأكيد جودة البيانات المصفاة

لا يكتمل خط أنابيب تنقية البيانات الاحترافي دون دمج منظومة متكاملة من اختبارات التحقق وتأكيد جودة المخرجات، لضمان أن عملية التصفية قد نفذت شرط NOT IN بدقة تامة ودون أي آثار جانبية غير مرغوبة. والأداة البرمجية المباشرة لتحقيق ذلك هي استخدام عبارات التأكيد في بايثون (assert statements) فور الانتهاء من التصفية، مثل صياغة جملة برمجية تتحقق رياضياً من أن تقاطع قيم العمود المصفى مع قائمة القيم المستبعدة يعيد مجموعة فارغة: assert df[df[‘col’].isin(excluded_values)].empty, “خطأ: البيانات لا تزال تحتوي على قيم مستبعدة”.

تتضمن استراتيجيات التحقق أيضاً مراقبة ومقارنة أبعاد إطار البيانات (Dimensions) عبر فحص خاصية df.shape قبل عملية التصفية وبعدها مباشرة. يتيح هذا الفحص المقارن للمحلل رصد النسبة المئوية للسجلات المحذوفة بدقة؛ فإذا أظهرت الأبعاد انخفاضاً مفاجئاً يتجاوز التوقعات الإحصائية (مثل فقدان تسعين بالمئة من البيانات دون سبب واضح)، أو على العكس، بقاء عدد الصفوف ثابتاً دون أي تغيير، يتم إيقاف خط التنفيذ فوراً للتحقق من سلامة الأقنعة المنطقية ومنع تمرير بيانات مشوهة إلى النماذج النهائية.

وأخيراً، يُعد تضمين اختبارات الوحدة الآلية (Automated Unit Tests) باستخدام أطر العمل المعيارية مثل pytest خطوة لا غنى عنها في بيئات التطوير المستمر (CI/CD). حيث يتم إنشاء مجموعات بيانات اختبارية مصغرة ومعلومة النتائج مسبقاً، وتمريرها عبر دوال التصفية المنطقية للتأكد من تعاملها السليم مع كافة الحالات المتطرفة، بما في ذلك القوائم الفارغة، والقيم المفقودة NaN، والأنواع البيانية المختلطة. إن ترسيخ هذه الاختبارات المنهجية يمنح فريق البيانات ثقة مطلقة في متانة وموثوقية خطوط الأنابيب التحليلية وخلوها التام من أي انحرافات إحصائية أو ثغرات برمجية غير متوقعة.

خاتمة

في ختام هذا الدليل المرجعي الشامل، يتضح بجلاء أن استيعاب آلية عمل عامل التصفية NOT IN في مكتبة بانداس يمثل مهارة جوهرية تتجاوز مجرد حفظ صيغة برمجية مقتضبة، لتمس عمق الفلسفة التصميمية والرياضية التي تقوم عليها بيئة معالجة البيانات في بايثون. إن غياب دالة صريحة تحمل هذا الاسم لم يكن عائقاً أمام المرونة البرمجية، بل كان دافعاً لتوظيف قوى الحوسبة المتجهة والجبر البولياني عبر دمج دالة التحقق من الانتماء isin() مع عامل التلدة (~)، وتوفير بدائل نصية راقية كدالة الاستعلام query() لتلبية متطلبات المشاريع المختلفة.

لقد استعرضنا كيف يمكن توظيف هذا الاستبعاد المنطقي بكفاءة متناهية عبر المتغيرات النصية والفئوية والرقمية، وأهمية اليقظة البرمجية في معالجة القضايا الدقيقة كحساسية النصوص، وتطابق الأنواع البيانية، وسلوك القيم المفقودة والفاصلة العائمة. كما بيّنت التحليلات الحاسوبية أن فهم البنية التحتية لتخزين البيانات واختيار الهياكل المناسبة كالمجموعات والفئات يحقق قفزات نوعية في سرعة التنفيذ وترشيد استهلاك الذاكرة عند معالجة السجلات المليونية.

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

المراجع

  • McKinney, W. (2022). Python for data analysis: Data wrangling with Pandas, NumPy, and Jupyter (3rd ed.). O’Reilly Media. https://wesmckinney.com/book/
  • The Pandas Development Team. (2023). pandas.Series.isin — pandas documentation. PyData. https://pandas.pydata.org/docs/reference/api/pandas.Series.isin.html
  • The Pandas Development Team. (2023). pandas.DataFrame.query — pandas documentation. PyData. https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.query.html
  • Harris, C. R., Millman, K. J., van der Walt, S. J., Gommers, R., Virtanen, P., Cournapeau, D., … & Oliphant, T. E. (2020). Array programming with NumPy. Nature, 585(7825), 357-362. https://doi.org/10.1038/s41586-020-2649-2
  • VanderPlas, J. (2016). Python data science handbook: Essential tools for working with data. O’Reilly Media. https://jakevdp.github.io/PythonDataScienceHandbook/
  • Python Software Foundation. (2023). Expressions: Bitwise operations. Python Documentation. https://docs.python.org/3/reference/expressions.html#bitwise-inversions

تقييم هذا المحتوى

0.0 / 5 0 تقييمات

اقتباس هذا المقال

looti, M. (2026, سبتمبر 16). كيفية استخدام عامل التصفية NOT IN في بانداس (مع أمثلة). عرب سايكلوجي. https://arabpsychology.com/statistics/how-to-use-not-in-filter-in-pandas-with-examples/
looti, Mohammed. “كيفية استخدام عامل التصفية NOT IN في بانداس (مع أمثلة).” عرب سايكلوجي, 16 سبتمبر 2026, https://arabpsychology.com/statistics/how-to-use-not-in-filter-in-pandas-with-examples/.
looti, Mohammed. “كيفية استخدام عامل التصفية NOT IN في بانداس (مع أمثلة).” عرب سايكلوجي. سبتمبر 16, 2026. https://arabpsychology.com/statistics/how-to-use-not-in-filter-in-pandas-with-examples/.