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

بانداس: كيفية استخدام isin لأعمدة متعددة

دليل أكاديمي شامل يشرح كيفية استخدام دالة isin لتصفية البيانات عبر أعمدة متعددة في مكتبة بانداس باستخدام الدوال المنطقية all وany والقواميس البرمجية.

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

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

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

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

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

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

1.1 أهمية الفهرسة والتصفية المنطقية في تحليل البيانات المعقدة

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

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

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

1.2 تموضع دالة isin ضمن منظومة معالجة البيانات الجدولية

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

وتكمن الدلالة التقنية لاستخدام isin() في كونها بديلاً حوسبياً متقدماً لسلسلة المعاملات المنطقية المتكررة مثل استخدام معامل المساواة المتعدد مع أداة الفصل المنطقي: (df['A'] == 1) | (df['A'] == 2) | (df['A'] == 3). يختزل استدعاء دالة df['A'].isin([1, 2, 3]) هذا التعقيد اللفظي في تعبير أحادي عالي الدقة، يعتمد داخلياً على جداول التجزئة (Hash Tables) التي توفر زمناً حسابياً يطابق O(1) للبحث عن كل عنصر داخل المجموعات المرجعية، مقارنة بالبحث الخطي التكراري O(N) الذي تفرضه المقارنات اليدوية المتعددة.

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

1.3 تحديات تطبيق معايير التصفية على أكثر من متغير في آن واحد

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

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

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

2. الأسس النظرية والبنيوية لعمل دالة isin() في بيئة بايثون

2.1 الميكانيكية الداخلية لتوليد الأقنعة الثنائية المنطقية

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

عند تمرير كائنات التكرار (Iterables) إلى الدالة، يتتبع المحرك الداخلي تدفق التنفيذ المصدري عبر تكرار سريع على مستوى لغة C يتجاوز قفل المفسر العام (GIL – Global Interpreter Lock) كلما كان ذلك متاحاً. ويتم فحص كل عنصر ومطابقته مقابل المجموعة المستهدفة؛ وإذا تم العثور على العنصر، يتم تخصيص القيمة الثنائية 1 (الممثلة للقيمة True)، وفي حال عدم العثور عليه، يتم تخصيص القيمة الثنائية 0 (الممثلة للقيمة False). وتستمر هذه العملية الشاملة عبر جميع السجلات، منتجة مصفوفة بوليانية ذات كثافة عالية.

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

2.2 مفهوم البث وعمليات التوجيه الشعاعي (Vectorization)

يعد التوجيه الشعاعي (Vectorization) حجر الزاوية الذي ترتكز عليه مكتبة بانداس لتفادي البطء الشديد المصاحب للحلقات التكرارية الصريحة في مفسر بايثون القياسي. ويعني هذا المفهوم نقل العبء الحسابي من مستوى بايثون عالي المستوى إلى تعليمات موجهة على مستوى العتاد الحسابي (Hardware SIMD Instructions – Single Instruction, Multiple Data)، حيث تقوم وحدة المعالجة المركزية بتطبيق العملية المنطقية نفسها على متجهات كاملة من البيانات في دورة ساعة واحدة أو بضع دورات محدودة.

وتستغل دالة isin() البنية المدمجة لمكتبة نمباي (NumPy) لإجراء المقارنات عبر مصفوفات الذاكرة المتصلة (C-contiguous arrays). ومن خلال قواعد البث الرياضي (Broadcasting)، يمكن مقارنة مصفوفات ذات أبعاد غير متماثلة طالما أنها تتوافق وفق قواعد التمدد المنطقي. فعند تمرير قائمة قيم إلى إطار بيانات متعدد الأعمدة، يقوم محرك الحوسبة ببث منطق التحقق عبر كل عمود على حدة كأنه متجهة مستقلة، دون الحاجة لإنشاء نسخ مادية إضافية للبيانات في الذاكرة.

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

2.3 التوزيع الهيكلي للأبعاد والمحاور في إطارات بيانات بانداس

لفهم كيفية تصفية أعمدة متعددة بدقة، يجب استيعاب التوزيع الهيكلي للمحاور في بانداس. يمتلك إطار البيانات ثنائي الأبعاد محورين رئيسيين: المحور الصفري الرأسي (axis=0 أو index) وهو الاتجاه الذي تتحرك فيه العمليات عبر الصفوف من أعلى إلى أسفل، والمحور الأفقي (axis=1 أو columns) وهو الاتجاه الذي تتحرك فيه العمليات عبر الأعمدة من اليسار إلى اليمين (أو العكس بحسب الاتجاه اللغوي للبيانات).

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

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

3. التمييز المنهجي بين تصفية العمود الفردي وتصفية الأعمدة المتعددة

3.1 تحليل سلوك دالة isin عند تطبيقها على سلسلة بيانات أحادية (Series)

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

تعتبر هذه الحالة النموذج القياسي المستقر لعمليات التصفية في بايثون؛ فالقناع الناتج لا يحتاج إلى أي معالجة لاحقة أو اختزال للأبعاد، بل يمكن تمريره مباشرة إلى مشغلات الفهرسة الموضعية مثل: df[df['Category'].isin(['A', 'B'])]. وتقتصر حالات الاستخدام هنا على فحص وتصنيف متغير أحادي دون أي تأثير أو اعتمادية متبادلة على متغيرات أخرى موجودة في السجل نفسه.

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

3.2 التحول البنيوي عند استدعاء الدالة على إطار فرعي متعدد الأعمدة

يحدث تحول بنيوي جوهري عندما يوجه المحلل استدعاء دالة isin() إلى إطار بيانات فرعي يتكون من عدة أعمدة، مثل: df[['col1', 'col2']].isin(target_values). في هذا السياق، لم تعد المخرجات سلسلة أحادية البعد جاهزة لتغذية مشغل الفهرسة، بل أصبحت إطار بيانات بولياني كامل يتضمن نفس عدد الصفوف والأعمدة التي تم استدعاؤها.

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

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

3.3 مقارنة معايير التقييم المنطقي: الفحص التوزيعي مقابل الفحص المشترك

يتعين على الباحث التمييز الدقيق بين نمطين من التقييم المنطقي عند التعامل مع الأعمدة المتعددة: الفحص التوزيعي (Marginal/Distributed Evaluation) والفحص المشترك (Joint Evaluation). ويعني الفحص التوزيعي اختبار انتماء القيمة لأي من الأعمدة المعنية بصورة مستقلة، دون النظر إلى التواجد التزامني لخصائص أخرى في نفس السجل، وهو ما ينتج عنه نطاق ترشيح واسع النطاق قد يحتوي على تشوهات دلالية غير مقصودة.

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

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

4. الطريقة الأولى: التصفية باشتراط تحقق المعايير لجميع الأعمدة عبر all(axis=1)

4.1 التأصيل المنطقي لعملية العطف الرياضي (AND Logic) عبر المحور الأفقي

ترتكز عملية العطف الرياضي المنطقي على مبدأ الصرامة التامة في قبول الشروط؛ ففي جدول الصواب والخطأ لمعامل العطف المنطقي (Logical Conjunction – AND)، لا تكون النتيجة صائبة (True) إلا إذا كانت كافة المدخلات الفرعية صائبة دون استثناء. وفي سياق إطارات بيانات بانداس، يؤدي استدعاء الدالة التجميعية all(axis=1) إلى تطبيق هذا المبدأ الرياضي على كل سجل أفقي بشكل متوازٍ.

عندما تُنتج دالة isin() مصفوفة النتائج البوليانية لعدة أعمدة، يقوم التابع all(axis=1) بمسح خلايا كل صف من اليسار إلى اليمين. فإذا احتوت جميع الخلايا المفحوصة داخل الصف على القيمة True، يستقر القناع النهائي للصف عند القيمة True؛ أما إذا احتوت خلية واحدة فقط على القيمة False، تسقط الصفة المنطقية عن الصف بأكمله ويتحول إلى False، مما يؤدي فوراً إلى استبعاده من مخرجات التصفية.

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

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

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

تتم صياغة التعبير البرمجي المباشر عبر تحديد الإطار الفرعي للأعمدة المستهدفة ثم استدعاء دالة isin() مع قائمة القيم المرجعية، متبوعة بالتابع all(axis=1) لتوليد القناع، على النحو التالي من الناحية الإجرائية: mask = df[['Department', 'Location']].isin(['Engineering', 'London']).all(axis=1). يتم بعد ذلك تمرير كائن القناع mask إلى إطار البيانات الأصلي للحصول على مجموعة البيانات المصطفاة: filtered_df = df[mask].

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

4.3 دراسة الحالات الخاصة: التكرار وتطابق القيم بين الأعمدة المتعددة

تظهر ثغرة منطقية وحوسبية كبرى عند استخدام القوائم المسطحة مع all(axis=1) في الحالات التي تتداخل فيها القيم المستهدفة بين الأعمدة، أو عندما تتشابه النطاقات القيمية للمتغيرات المفحوصة. تسمى هذه الظاهرة في هندسة البيانات فخ الإيجابيات الكاذبة (False Positives)، وهي إحدى أكثر المشكلات البرمجية الصامتة خطورة نظراً لأنها لا تطلق أي استثناء برمجي بل تنتج بيانات خاطئة ظاهرياً.

لتوضيح هذه المعضلة: إذا كان لدينا إطار بيانات يحتوي على العمودين Origin_City وDestination_City، ومررنا القائمة ['Cairo', 'Dubai'] إلى التعبير: df[['Origin_City', 'Destination_City']].isin(['Cairo', 'Dubai']).all(axis=1)، فإن هذا التعبير سيقبل الصفوف التي تكون فيها نقطة الانطلاق دبي والوجهة القاهرة، والصفوف التي تكون فيها نقطة الانطلاق القاهرة والوجهة دبي، بل وسيقبل أيضاً الصفوف التي تكون فيها نقطة الانطلاق القاهرة والوجهة القاهرة إذا تواجدت مثل هذه السجلات!

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

5. الطريقة الثانية: التصفية باشتراط تحقق معيار واحد على الأقل عبر any(axis=1)

5.1 التأصيل المنطقي لعملية الفصل الرياضي (OR Logic) عبر المحور الأفقي

على النقيض تماماً من صرامة العطف المنطقي، تستند عملية الفصل الرياضي (Logical Disjunction – OR) إلى مبدأ التساهل والشمول؛ فوفق قواعد الجبر البولياني، تصبح النتيجة صائبة (True) بمجرد تحقق شرط صائب واحد على الأقل من بين مجموعة الشروط المطروحة. ويُترجم هذا المفهوم في بانداس عبر التابع التجميعي any(axis=1) الموجه أفقياً عبر الصفوف.

يقوم التابع any(axis=1) بفحص عناصر الصف الواحد عبر الأعمدة المحددة داخل المصفوفة البوليانية المولدة بواسطة isin(). وبمجرد أن يواجه التابع قيمة True في أي خلية من خلايا الصف، يتوقف تقييم السجل فوراً ويتم تعيين القيمة المنطقية النهائية للصف كـ True، بغض النظر عما إذا كانت بقية الخلايا في الأعمدة الأخرى تحمل القيمة False. ولا يُقصى الصف من المخرجات نهائياً إلا إذا كانت جميع خلاياه المستهدفة سالبة (تحمل القيمة False).

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

5.2 التنفيذ الإجرائي البرمجي لاستخراج السجلات المتوافقة جزئياً

يتم تطبيق هذا الأسلوب برمجياً بصياغة مطابقة بنيوياً لأسلوب all()، مع استبدال التابع التجميعي ليصبح any(axis=1). وتأخذ الشيفرة المباشرة التعبير الآتي: disjunctive_mask = df[['col1', 'col2']].isin([val1, val2]).any(axis=1)، ثم يتم تطبيق القناع على الإطار الأساسي عبر result_df = df[disjunctive_mask].

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

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

5.3 تحليل الحساسية والآثار المترتبة على شمولية النتائج

يحمل استخدام أسلوب التصفية المتساهل عبر any(axis=1) مخاطر إحصائية ترتبط باتساع نطاق معايير الاختيار إلى الحد الذي قد يبتلع عينات ملوثة أو غير ملائمة لأهداف النموذج التحليلي. وتعرف هذه الظاهرة في علم القياس الإحصائي بانخفاض الدقة النوعية (Specificity) مقابل ارتفاع الحساسية (Sensitivity)؛ حيث تزداد احتمالية التقاط بيانات شاذة (Outliers) بسبب مرونة شرط القبول.

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

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

6. التحكم المتقدم والدقيق عبر استخدام القواميس البرمجية (Dictionaries)

6.1 تجاوز إشكالية تداخل القيم عبر ربط كل عمود بقيمه الخاصة

يمثل تمرير القواميس البرمجية (Dictionaries) كمدخلات لدالة isin() الذروة الهندسية للاستعلامات الدقيقة في إطار عمل بانداس. في هذا النمط المتقدم، يتم استبدال القوائم المسطحة مجهولة الهوية بهيكل بياني متماسك يربط كل عمود على حدة بمصفوفة أو قائمة القيم الخاصة به حصرياً، متخذاً الصيغة البنيوية: mapping_dict = {'Column_A': [val1, val2], 'Column_B': [val3, val4]}.

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

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

6.2 الدمج بين القواميس ودوال التجميع المنطقي (all و any)

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

لضمان المطابقة الثنائية المستقلة والصحيحة لعدة أعمدة محددة بواسطة قاموس، يجب حصر نطاق التجميع المنطقي على تلك الأعمدة فقط المستهدفة في القاموس، وتجنب تطبيقه على كامل إطار البيانات ما لم تكن كافة الأعمدة مشمولة في القاموس. وتصاغ العملية على النحو التالي: target_cols = list(mapping_dict.keys()) ثم استدعاء القناع: mask = df[target_cols].isin(mapping_dict).all(axis=1). يضمن هذا الإجراء أن تكون المطابقة عبر all(axis=1) مشروطة فقط بالأعمدة المعنية بالدراسة دون التأثر بالأعمدة المتروكة خارج القاموس.

كذلك يمكن تطبيق any(axis=1) مع القواميس المخصصة لتحقيق مرونة مشروطة باختصاص المتغيرات؛ فبدلاً من القول “استبقِ الصف إذا ظهرت أي قيمة من القائمة في أي عمود”، يصبح التعبير أكثر انضباطاً: “استبقِ الصف إذا احتوى العمود A على قيمه المخصصة أو احتوى العمود B على قيمه المخصصة”. هذا التمييز الدقيق ينقل التحليل من العشوائية إلى الانضباط الرياضي الكامل.

6.3 إدارة الشروط غير المتكافئة وغير المتناظرة بين المتغيرات

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

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

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

7. معالجة القيم المفقودة (NaN / Null) وتأثيرها على نتائج التصفية

7.1 سلوك دالة isin() في التعامل مع القيم الغائبة تلقائياً

تعتبر إدارة القيم المفقودة (Missing Values) والبيانات الغائبة إحدى أكثر المراحل حساسية في علم البيانات، حيث تفرض المعايير الرياضية قيوداً صارمة على كيفية مقارنة القيم غير المعرفة. وبشكل افتراضي، تفشل المقارنات المباشرة مع القيم المفقودة في بايثون عموماً وفي بانداس خصوصاً استناداً إلى معيار النقطة العائمة IEEE 754، الذي يقر بأن القيمة الرياضية NaN لا تساوي أي قيمة أخرى، بما في ذلك نفسها: np.nan != np.nan.

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

وعند دمج هذا السلوك مع الدوال التجميعية مثل all(axis=1)، تتفاقم الأزمة الإحصائية؛ إذ يكفي أن يحتوي صف معين على قيمة مفقودة واحدة في أحد الأعمدة المفحوصة حتى يُحكم على الصف بأكمله بالإقصاء من نتائج التصفية، حتى وإن كانت بقية الأعمدة في الصف ذاته تحقق الشروط المستهدفة بدقة تامة، مما يتسبب في تشويه نسب العينات وانحياز التحليل (Selection Bias).

7.2 تقنيات تضمين القيم المفقودة ضمن قوائم البحث المستهدفة

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

تكمن الصعوبة التقنية هنا في التباين الدلالي بين أنواع البيانات الخالية في بيئة بايثون المتطورة؛ فهناك كائن None الأصلي للبايثون، وكائن np.nan المخصص للمصفوفات الرقمية العائمة، وكائن pd.NaT المخصص للأزمنة والتواريخ المفقودة، بالإضافة إلى pd.NA للمتغيرات المنطقية والنصية الحديثة ذات الأنواع القابلة للغياب (Nullable Data Types). لذا يجب التأكد من التوافق الصارم بين نوع القيمة المفقودة في العمود ونوعها الممرر داخل دالة isin().

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

7.3 استراتيجيات المعالجة المسبقة لتفادي الإقصاء غير المقصود للسجلات

لتجنب الإقصاء العشوائي أو التصفية المشوهة الناتجة عن القيم المفقودة، توصي الأدبيات الهندسية باعتماد استراتيجيات استباقية للمعالجة قبل الشروع في بناء الأقنعة المنطقية المعقدة. وتتمثل الاستراتيجية الأولى في الدمج الهيكلي الصريح بين دالة التحقق من القيم المفقودة isna() ودالة isin() باستخدام المعاملات المنطقية المركبة لإنشاء قناع متعدد الطبقات: (df['A'].isin(target_vals)) | (df['A'].isna()).

أما الاستراتيجية الثانية، فترتكز على تطبيق تقنيات الإحلال والملء المسبق (Imputation) على إطار البيانات أو على نسخة معزولة منه مخصصة للتصفية. يتم في هذه التقنية ملء الفراغات بقيم اصطناعية تمثل فئة مستقلة، مثل استخدام السلسلة النصية "MISSING_DATA" للمتغيرات الاسمية أو القيمة -999 للمتغيرات الرقمية عبر دالة fillna()، مما يسمح بإدراج هذه القيم الوهمية داخل دالة isin() بصورة طبيعية دون الاصطدام بحواجز المقارنة المنطقية للـ NaN.

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

8. مقارنة الأداء الحسابي: دالة isin() مقابل بدائل التصفية في بانداس

8.1 المقارنة مع التعبيرات المنطقية المباشرة (Boolean Operators: & و |)

يعد استخدام المعاملات الثنائية المباشرة مثل معامل العطف & ومعامل الفصل | البديل الكلاسيكي الأكثر انتشاراً لدالة isin(). في هذا النهج، يقوم المبرمج بصياغة كل شرط مستقل داخل زوج من الأقواس الدائرية لضمان أولوية التنفيذ، كأن يكتب: (df['A'] == 1) & (df['B'] == 'X').

عند إجراء قياس مقارن لزمن التنفيذ (Execution Time Benchmarking) بين الأسلوبين على مجموعات بيانات متوسطة وضخمة، تظهر النتائج تفوقاً ملحوظاً لدالة isin() كلما زاد عدد القيم المستهدفة للعمود الواحد؛ حيث تضطر المعاملات الثنائية إلى إعادة مسح العمود بالكامل في الذاكرة لكل قيمة مفردة تفصل بينها أداة |، مما يرفع التعقيد الحسابي إلى O(M * N) حيث M يمثل عدد القيم المستهدفة وN يمثل عدد الصفوف، في حين تحتفظ isin() بتعقيد يقارب O(N) بفضل جداول التجزئة.

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

8.2 المقارنة مع واجهة الاستعلام النصي المتقدمة (DataFrame.query)

تقدم مكتبة بانداس واجهة استعلام نصية متطورة تُعرف بدالة DataFrame.query()، وتعتمد داخلياً على محرك NumExpr فائق السرعة. تتيح هذه الواجهة كتابة شروط التصفية في هيئة سلاسل نصية واضحة ومقروءة تحاكي أوامر لغة الاستعلامات البنيوية (SQL)، مثل: df.query("Department in ['Engineering', 'Finance'] and Location in ['London', 'Berlin']").

تتفوق دالة query() في مجموعات البيانات الضخمة التي لا تتسع الذاكرة العشوائية لنسخها الوسيطة؛ إذ يقوم محرك numexpr بتجزئة المصفوفات وتمريرها مباشرة عبر كتل الذاكرة المؤقتة لوحدة المعالجة المركزية (CPU L1/L2 Caches)، مما يمنع تخصيص مساحات ذاكرة للمصفوفات البوليانية المؤقتة الكبيرة، وهو ما يمنحها ميزة أداء استثنائية في البيئات محدودة الموارد التخزينية.

ومع ذلك، تواجه دالة query() محددات معرفية وبرمجية هامة عند التعامل مع البيئات البرمجية المعقدة؛ فهي تفرض تكلفة إضافية مبدئية لتحليل السلسلة النصية وترجمتها إلى شجرة بناء لغوي (Abstract Syntax Tree – AST)، مما يجعلها أبطأ من isin() في مجموعات البيانات الصغيرة. علاوة على ذلك، تواجه الدالة صعوبات في التكامل مع المتغيرات المحلية المعقدة داخل دوال بايثون المغلقة (Closures)، مما يجعل isin() الخيار الأكثر مرونة وتوافقاً مع لغة بايثون القياسية.

8.3 المقارنة مع الفهرسة باستخدام دالة loc وعمليات الدمج الداخلي (Inner Merge)

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

البديل الهيكلي الحقيقي لتصفية الأزواج المتعددة من المتغيرات هو أسلوب التصفية بالدمج (Filtering via Merge / Semi-Join)؛ حيث ينشئ المحلل إطار بيانات مرجعي صغير يحتوي على التوليفات الصالحة حصرياً للأعمدة المستهدفة، ثم يجري عملية دمج داخلي (inner merge) مع إطار البيانات الأصلي استناداً إلى تلك الأعمدة: df.merge(target_df, on=['col1', 'col2'], how='inner'). يتفوق هذا الأسلوب بشكل كاسح عندما تكون العلاقات بين المتغيرات غير قابلة للفصل عبر القوائم أو القواميس البسيطة (مثل اشتراط اقتران قيم محددة تماماً عبر 3 أو 4 أعمدة في آن واحد).

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

  • دالة isin() مع القواميس: التعقيد الزمني: O(N) | استهلاك الذاكرة: متوسط | سهولة الصيانة: مرتفعة جداً | مثالية للاستعلامات متعددة الأعمدة ذات الشروط المستقلة لكل عمود.
  • المعاملات المنطقية (& و |): التعقيد الزمني: O(M * N) | استهلاك الذاكرة: مرتفع | سهولة الصيانة: منخفضة ومعقدة | مناسبة فقط للشروط البسيطة التي تجمع بين مقارنات رقمية ومنطقية محدودة.
  • دالة DataFrame.query(): التعقيد الزمني: O(N) فائق السرعة مع المجموعات الضخمة | استهلاك الذاكرة: منخفض جداً | سهولة الصيانة: مرتفعة | مثالية للبيانات الضخمة والشروط الشبيهة بلغة SQL.
  • الدمج الداخلي (Inner Merge): التعقيد الزمني: O(N log N) إلى O(N) بحسب الخوارزمية | استهلاك الذاكرة: متوسط إلى مرتفع | سهولة الصيانة: مرتفعة جداً | الخيار الأمثل والوحيد للتحقق من التوليفات الشرطية المقترنة قطيعاً عبر أعمدة متباينة.

9. تطبيقات منهجية واقعية: تحليل بيانات الأداء الرياضي والمسوح الإحصائية

9.1 التطبيق الإجرائي الأول: تحليل كفاءة لاعبي كرة السلة حسب الفريق والمركز

تعتمد التحليلات الرياضية المتقدمة في دوريات كرة السلة العالمية مثل الرابطة الوطنية لكرة السلة الأمريكية (NBA) على فحص دقيق لسجلات الأداء الفردي والجماعي للاعبين عبر أبعاد تكتيكية متعددة. وفي هذا التطبيق العملي، نفترض وجود مجموعة بيانات ضخمة تحتوي على إحصاءات تشمل: معرف اللاعب، واسم الفريق (Team)، والمركز التكتيكي (Position)، ومعدل تسجيل النقاط، ومعدل الاستحواذ على المرتدات والتمريرات الحاسمة.

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

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

9.2 التطبيق الإجرائي الثاني: تصفية نتائج الدراسات الاستقصائية متعددة المحاور

في مجال العلوم الاجتماعية والمسوح الديموغرافية، يواجه الباحثون مجموعات بيانات استبيانية واسعة النطاق تتألف من عشرات المتغيرات الفئوية والترتيبية. ولنفترض إجراء دراسة ميدانية حول أنماط الاستهلاك الرقمي في مجتمع سكاني، حيث تشتمل البيانات على: الفئة العمرية (Age_Group)، والإقليم الجغرافي (Region)، والمستوى التعليمي، والحالة الوظيفية (Employment_Status).

يستهدف الاستقصاء حصر عينة ممثلة للشباب والمهنيين في المناطق الحضرية، ولتكن الفئات المستهدفة هي الأعمار بين 18-35 عاماً في الإقليمين “الأوسط” و”الغربي” من فئات “الموظفين بدوام كامل” و”رواد الأعمال”. هنا يتم توظيف دالة isin() المعتمدة على القاموس لاستبعاد كافة الفئات خارج هذا النطاق، مما يتيح عزل العينات غير المتوافقة لدراسة أثر التحيز في الاستجابة (Non-Response Bias) ومقارنة خصائصها بالعينة المستهدفة.

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

9.3 التطبيق الإجرائي الثالث: تنقية السجلات المالية وتدقيق المعاملات المشبوهة

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

تعتمد خوارزميات التدقيق الجنائي على مطابقة المعاملات التي تقع ضمن فئات إنفاق عالية المخاطر (مثل: الكازينوهات، وتجارة المعادن الثمينة، وتحويلات العملات المشفرة) والصادرة حصرياً من أنواع حسابات محددة كالحسابات المؤسسية حديثة الإنشاء. يتم هنا دمج دالة isin() مع أدوات النفي المنطقي المتقدمة عبر استخدام عامل النفي التيلدا ~df[cols].isin(dict).all(axis=1) لاستبعاد آلاف المعاملات الروتينية المصرح بها والمعروفة مسبقاً، مما يحصر نطاق الفحص البشري في بؤرة المعاملات غير النمطية.

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

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

10.1 خطأ اختلال الأبعاد والمحاور (Index & Axis Mismatches)

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

يترتب على هذا الخطأ الكارثي توليد سلسلة بوليانية تتطابق أبعادها مع عدد الأعمدة وليس مع عدد الصفوف! وعند محاولة تمرير هذه السلسلة القصيرة كقناع ترشيح لإطار البيانات الأصلي، يطلق مفسر بايثون فوراً استثناء هيكلياً من نوع IndexingError: Unalignable boolean Series provided as indexer، أو يقوم بتوليد نتائج غير متوقعة تماماً في الإصدارات القديمة نتيجة محاولات المحاذاة التلقائية للفهارس غير المتناظرة.

لتشخيص وتصحيح هذا الخطأ، يجب على مهندس البيانات فحص شكل المصفوفة المنطقية (Shape Check) عبر الخاصية mask.shape قبل إرسالها إلى مشغل الفهرسة. ويجب التأكد دائماً من أن طول القناع يطابق تماماً خاصية len(df)، وأن الأبعاد أحادية (ndim == 1)، وأن المعامل axis=1 مثبت صراحة في نص الاستدعاء لضمان استقامة المحور الأفقي للتجميع.

10.2 فخ المطابقة الخاطئة الناتجة عن تمرير القوائم المسطحة

يمثل تمرير القوائم المسطحة إلى عدة أعمدة في آن واحد الفخ المنطقي الصامت الأكثر انتشاراً بين الباحثين؛ حيث تفشل الشيفرة df[['Status', 'Priority']].isin(['Active', 'High']) في الفصل بين دلالات المتغيرات، مما يسفر عن تسجيل حالات إيجابية كاذبة كما فصّلنا في المباحث السابقة، دون أن يُطلق النظام أي رسالة تحذيرية برمجية تدل على الخلل الدلالي للبيانات.

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

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

10.3 مشكلات تباين أنواع البيانات (Data Type Incompatibilities)

تعتبر مشكلات تباين وعدم توافق أنواع البيانات (Data Type Incompatibilities) سبباً رئيسياً لظهور حالات سلبية كاذبة (False Negatives)، حيث تفشل دالة isin() في مطابقة قيم تبدو متطابقة بصرياً للعين البشرية ولكنها متباينة في تمثيلها الثنائي التخزيني في مساحة الذاكرة.

من أبرز أمثلة هذا الخلل: محاولة مطابقة أرقام صحيحة مخزنة داخل القوائم بصيغة أعداد [101, 102] مع أعمدة في إطار البيانات تم استيرادها من ملفات نصية (CSV) وتخزينها كسلاسل نصية ['101', '102']. في هذه الحالة، تعيد بايثون القيمة False دائماً لأن المقارنة بين الكائنات من نوع int والكائنات من نوع str تعيد عدم تطابق حتمي: 101 != '101'، مما يؤدي إلى تفريغ إطار البيانات المصفى تماماً من السجلات دون أن يدري المطور سبب الفشل.

كذلك تبرز تحديات مماثلة عند التعامل مع المتغيرات الفئوية (Categoricals) ذات الفئات غير المعرفة مسبقاً، أو عند وجود مسافات بيضاء غير مرئية (Trailing Whitespaces) في السلاسل النصية، أو وجود فروق في حالة الأحرف (Case Sensitivity). وتقتضي منهجية التصحيح توحيد أنماط الأعمدة المستهدفة مسبقاً باستخدام دوال التحويل النوعي مثل astype() وإزالة الشوائب النصية عبر str.strip() قبل الشروع في بناء استعلامات التصفية.

11. تحسين الأداء الحسابي وإدارة الذاكرة مع مجموعات البيانات الضخمة

11.1 استراتيجيات استهلاك الذاكرة أثناء توليد الأقنعة المنطقية

يمثل استهلاك الذاكرة العشوائية الهاجس الأكبر عند التعامل مع مجموعات البيانات الجدولية الضخمة التي تتجاوز ملايين السجلات وعشرات الأعمدة. فعند تطبيق دالة isin() على إطار بيانات واسع النطاق، يقوم النظام بإنشاء مصفوفة منطقية وسيطة تحتل مساحة تخزينية إضافية توازي حجم البيانات المفحوصة، مما قد يدفع بيئة التشغيل إلى استنزاف الذاكرة والانهيار القسري (Out-Of-Memory Error – OOM).

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

علاوة على ذلك، يلعب التحويل المسبق للبيانات إلى أنواع موفرة للمساحة دوراً حاسماً في خفض البصمة الذاكرية؛ فتحويل السلاسل النصية المكررة إلى متغيرات فئوية (category) واستخدام الأعداد الصحيحة ذات الحجم الأدنى (مثل int8 أو int16 بدلاً من int64) يقلص المساحة المستهلكة بنسب تصل إلى 80%. ويمكن مراقبة هذا التحسن التشغيلي بدقة عبر استدعاء التابع df.memory_usage(deep=True) قبل وبعد تطبيق التصفية لقياس الكفاءة التخزينية.

11.2 تسريع عمليات التصفية باستخدام مجموعات بايثون (Sets) ومكتبة Dask

يتأثر زمن تنفيذ دالة isin() بالهيكل التخزيني للقائمة المرجعية الممرضة للبحث؛ فعند البحث داخل قوائم بايثون القياسية (Lists) الطويلة جداً التي تحتوي على آلاف العناصر، ينحدر الأداء الحسابي تدريجياً. ولتسريع هذه العملية، توصي أفضل الممارسات بتحويل القوائم المرجعية إلى مجموعات رياضية (Sets) قبل تمريرها للدالة: set(target_values)، للاستفادة من خوارزميات التجزئة التي توفر زمناً ثابتاً للبحث يطابق O(1) بغض النظر عن حجم المجموعة المرجعية.

وعندما تتجاوز أحجام البيانات سعة الذاكرة المادية للجهاز بالكامل (Out-of-Core Datasets)، تبرز مكتبة داسك (Dask) كأداة توسعية استثنائية؛ حيث توفر واجهة برمجية تحاكي بانداس تماماً مع تقسيم البيانات إلى أجزاء متعددة (Chunks) ومعالجتها بالتوازي عبر نوى المعالجة المتعددة أو العناقيد الحوسبية السحابية (Distributed Clusters). وتعمل دالة isin() داخل داسك بأسلوب التقييم الكسول (Lazy Evaluation)، حيث لا يتم تنفيذ الاستعلام في الذاكرة إلا عند استدعاء التابع .compute() صراحة.

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

11.3 تجنب إنشاء نسخ غير ضرورية من البيانات (Memory Views vs Copies)

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

عند استخدام df[mask]، يعيد بانداس في كثير من الأحيان شريحة مجتزأة قد تكون مجرد عرض يشير إلى نفس كتلة الذاكرة المخصصة للإطار الأساسي؛ ومحاولة إسناد قيم جديدة إلى هذه الشريحة المصفاة بصورة مباشرة قد تفشل أو تؤدي إلى تعديلات غير مقصودة في البيانات الأصلية. ولتجنب هذا الاضطراب الهندسي وضمان سلامة خطوط الإنتاج، يتعين على المبرمج الاستدعاء الصريح للتابع .copy() فور الانتهاء من التصفية: filtered_df = df[mask].copy().

يضمن هذا الاستدعاء تخصيص مساحة ذاكرة مستقلة ونظيفة لإطار البيانات المصفى، مما يفصل مسار التعديلات اللاحقة كلياً عن الإطار القديم، ويقضي تماماً على التحذيرات البرمجية، ويحسن من سلاسل العمليات المتصلة (Method Chaining) عبر تحرير الذاكرة المخصصة للبيانات الأصلية فور زوال الحاجة إليها عبر جامع القمامة البرمجي (Garbage Collector).

12. أفضل الممارسات البرمجية والمبادئ التوجيهية لكتابة شيفرات مستدامة

12.1 معايير كتابة شيفرات نظيفة وقابلة للقراءة وفق دليل PEP 8

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

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

علاوة على ذلك، ينبغي تضمين تعليقات توثيقية واضحة (Docstrings and Inline Comments) تشرح الافتراضات الحسابية الكامنة وراء اختيار التابع all(axis=1) في مقابل any(axis=1)، وتوضيح الأسباب الكامنة وراء استبعاد أو تضمين القيم المفقودة. هذا التوثيق المعياري يقلص الزمن اللازم للصيانة الدورية ويمنع حدوث انقطاعات تشغيلية أثناء تسليم المشروعات للفرق الهندسية اللاحقة.

12.2 بناء اختبارات الوحدة (Unit Testing) للتحقق من سلامة التصفية

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

يتم تصميم حالات الاختبار عبر إنشاء إطارات بيانات مصغرة (Mock DataFrames) ومصطنعة بعناية، تحتوي على كافة الحالات الحدية المحتملة (Edge Cases)، مثل: الصفوف التي تحقق كافة الشروط، والصفوف التي تحقق شرطاً واحداً فقط، والصفوف التي تحتوي على قيم مفقودة (NaNs)، والصفوف ذات الأنواع البيانية المتباينة. يتم بعد ذلك استدعاء دالة التصفية ومقارنة مخرجاتها بالمخرجات المتوقعة نظرياً باستخدام دوال التوكيد الصارمة مثل pandas.testing.assert_frame_equal().

تضمن هذه الاختبارات المؤتمتة عدم تراجع الأداء أو حدوث تشوهات صامتة في النتائج عند ترقية إصدارات مكتبة بانداس أو تعديل الهياكل البرمجية الأساسية للنظام. كما تتيح مراقبة مستمرة لسلامة الافتراضات الرياضية داخل بيئات التكامل المستمر والنشر المستمر (CI/CD)، مما يرسخ الثقة المؤسسية في مخرجات التحليل والتقارير المبنية عليها.

12.3 خلاصة الدليل وخريطة اتخاذ القرار لاختيار أسلوب التصفية الأمثل

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

  • الحالة الأولى: إذا كانت المتغيرات المستهدفة مستقلة تماماً، ولكل عمود قائمة قيمه المعزولة والمحددة بدقة: يُعتمد أسلوب القاموس البرمجي المشروط مقترناً بـ all(axis=1) للمطابقة التامة، أو any(axis=1) للمطابقة المرنة؛ فهذا هو الأسلوب الأكثر أماناً وقابلية للصيانة.
  • الحالة الثانية: إذا كانت الأعمدة متعددة ولكنها تمثل متغيرات متجانسة قياسياً ودلالياً وتتشارك نفس قائمة القيم المستهدفة دون حاجة للتخصيص: يمكن استخدام القوائم المسطحة المباشرة مع الأعمدة المختارة، شريطة التدقيق الصارم ضد الإيجابيات الكاذبة والتأكد من عدم وجود تداخلات غير مقصودة.
  • الحالة الثالثة: إذا كانت الشروط تمثل توليفات مقترنة وصارمة لا يمكن فصلها بين الأعمدة (مثل اشتراط اقتران الزوج المحدد (A1, B2) حصرياً دون قبول (A1, B3)): يتعين الابتعاد عن isin() والاعتماد كلياً على أسلوب الدمج الداخلي (Inner Merge) مع إطار بيانات مرجعي.
  • الحالة الرابعة: إذا كانت أحجام البيانات هائلة والذاكرة العشوائية مقيدة ومحدودة: يفضل صياغة الشروط باستخدام دالة DataFrame.query() المدعومة بمحرك numexpr، أو توسيع نطاق المعالجة عبر أطر الحوسبة الموزعة مثل Dask.

إن الموازنة الحكيمة بين سرعة المعالجة وسلامة النزاهة الإحصائية هي المهارة الجوهرية التي تفصل بين كتابة الشيفرات الهواة وبناء النظم البرمجية الاحترافية؛ وتظل دالة isin() في بانداس – إذا ما استُخدمت وفق المبادئ الهيكلية المفصلة في هذا الدليل – أداة بالغة القوة والأناقة لتحقيق هذا التوازن المنشود في أعقد بيئات تحليل البيانات الضخمة.

خاتمة

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

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

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

المراجع

  • McKinney, W. (2010). Data structures for statistical computing in Python. In Proceedings of the 9th Python in Science Conference (Vol. 445, pp. 51–56). Austin, TX: SciPy. https://doi.org/10.25080/Majora-92bf1924-00a
  • 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.DataFrame.isin — pandas 2.1.4 documentation. PyData. https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.isin.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
  • Rocklin, M. (2015). Dask: Parallel computation with blocked algorithms and task scheduling. In Proceedings of the 14th Python in Science Conference (pp. 126–132). Austin, TX: SciPy. https://doi.org/10.25080/Majora-7b98e3ed-013
  • Van Rossum, G., Warsaw, B., & Coghlan, N. (2001). PEP 8: Style guide for Python code. Python Software Foundation. https://peps.python.org/pep-0008/
  • IEEE Computer Society. (2019). IEEE Standard for Floating-Point Arithmetic (IEEE Std 754-2019). IEEE. https://doi.org/10.1109/IEEESTD.2019.8766229

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

0.0 / 5 0 تقييمات

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

looti, M. (2026, سبتمبر 12). بانداس: كيفية استخدام isin لأعمدة متعددة. عرب سايكلوجي. https://arabpsychology.com/statistics/pandas-how-to-use-isin-multiple-columns/
looti, Mohammed. “بانداس: كيفية استخدام isin لأعمدة متعددة.” عرب سايكلوجي, 12 سبتمبر 2026, https://arabpsychology.com/statistics/pandas-how-to-use-isin-multiple-columns/.
looti, Mohammed. “بانداس: كيفية استخدام isin لأعمدة متعددة.” عرب سايكلوجي. سبتمبر 12, 2026. https://arabpsychology.com/statistics/pandas-how-to-use-isin-multiple-columns/.