بايثون وتحليل البيانات, علم البيانات

بانداس: إنشاء عمود جديد باستخدام شروط If Else المتعددة


تُعد عملية هندسة الخصائص (Feature Engineering) والتحويل الشرطي للبيانات ركيزة جوهرية في خطوط أنابيب معالجة وتحليل البيانات الضخمة وبناء نماذج تعلم الآلة. في بيئة لغة البرمجة بايثون، تتربع مكتبة Pandas على عرش الأدوات المستخدمة للتعامل مع هياكل البيانات الجدولية المتمثلة في أطر البيانات (DataFrames). ومع ذلك، يواجه علماء ومحللو البيانات تحدياً منهجياً مستمراً يتمثل في كيفية اشتقاق وتوليد أعمدة جديدة بناءً على شروط منطقية متعددة ومتشابكة (Multiple If-Else Conditions) بكفاءة برمجية وحسابية عالية.

تكمن المعضلة الأساسية في الاختيار بين الأساليب التقليدية الموروثة من البرمجة الإجرائية، مثل حلقات التكرار الصريحة وتطبيق الدوال السطرية، وبين الأساليب الموجهة والمتجهية (Vectorized Approaches) التي تستغل قدرات المعالجة منخفضة المستوى المكتوبة بلغة C عبر مكتبة NumPy. إن الاعتماد على الشروط المتعددة يتطلب فهماً عميقاً للمنطق البولياني الثنائي (Bitwise Boolean Logic)، وآليات إدارة الذاكرة، والتأثيرات النمطية للقيم المفقودة، فضلاً عن تجنب الأخطاء الشائعة المرتبطة بالأسبقية الحسابية وتطابق الأبعاد.

يقدم هذا المرجع الشامل دراسة مستفيضة ومتعمقة لجميع المنهجيات المتاحة داخل منظومة بايثون لإنشاء أعمدة جديدة مشروطة بتفرعات منطقية معقدة. سنناقش بالتفصيل الرياضي والتطبيقي الآليات المتنوعة مثل numpy.select، وnumpy.where المتداخلة، والدوال المخصصة عبر apply، وأحدث الإضافات المعيارية مثل Series.case_when في إصدارات بانداس الحديثة، مع تقديم مقارنات معيارية للأداء، واستراتيجيات معالجة الحالات الحدية وتكامل خطوط الإنتاج البرمجية.

1. المفاهيم التأسيسية لهندسة الخصائص الشرطية في Pandas

1.1 أهمية التفرع الشرطي في معالجة وتحليل البيانات

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

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

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

1.2 المشكلات الشائعة عند استخدام حلقات التكرار التقليدية

يعمد المبرمجون القادمون من خلفيات برمجية إجرائية تقليدية إلى استخدام حلقات for أو دوال التكرار السطري مثل DataFrame.iterrows() للمرور على صفوف البيانات سطراً بسطر وتنفيذ جمل if-elif-else. يمثل هذا النمط كارثة أدائية حقيقية عند التعامل مع مجموعات البيانات الكبيرة؛ حيث يتخلى المبرمج عن المعالجة المتجهية وينقل عبء التنفيذ إلى مفسر بايثون البطيء (Python Interpreter Overhead)، مما يرفع التعقيد الزمني إلى مستويات خطية عالية تجعل المعالجة غير قابلة للتوسع على الإطلاق.

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

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

2. البنية النحوية والميكانيكية لدالة numpy.select

2.1 المكونات الهيكلية لقائمة الشروط (Condition List)

تُعد دالة numpy.select الأداة القياسية والأكثر قوة وكفاءة للتعامل مع الشروط المتعددة المتوازية في بايثون وبانداس. تعتمد الدالة في نواتها على استقبال قائمة من المصفوفات البولية (List of Boolean Arrays/Series)، حيث يمثل كل عنصر في القائمة شرطاً منطقياً كاملاً يُقيَّم على مستوى مصفوفة السلسلة بالكامل. يتم بناء هذه القائمة وتمريرها للدالة كوسيط أول، مما يسمح بتقييم منظم ومنفصل للشروط عن المخرجات.

من الأهمية بمكان إدراك الفارق الجوهري بين المعاملات المنطقية القياسية في بايثون (and, or, not) والمعاملات الثنائية النقطية الموجهة (&, |, ~). عند التعامل مع هياكل بانداس ونمباي، لا يمكن استخدام الكلمات المفتاحية النصية لأنها تحاول تقييم الحقيقة البولية للكائن بأكمله كقيمة واحدة (Scalar Truth Value)، وهو ما يطلق خطأ القيمة الشهير ValueError. في المقابل، تقوم المعاملات الثنائية بتطبيق العملية المنطقية عنصرًا بعنصر (Element-wise) عبر كامل طول المصفوفة.

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

2.2 مصفوفة النتائج المكافئة (Choice List)

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

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

تعمل دالة numpy.select وفق مبدأ التقييم التتابعي لأسبقية التحقق الأول (First-True-Wins Priority). هذا يعني أن محرك التقييم يمر على مصفوفات الشروط بالترتيب، وبمجرد تحقق شرط معين لصف محدد، يتم إسناد القيمة المقابلة له فوراً وتجاهل كافة الشروط اللاحقة لذلك الصف حتى لو كانت صحيحة منطقياً. هذا السلوك يحاكي تماماً بنية if-elif-else التقليدية، مما يتطلب هندسة ترتيب الشروط بعناية فائقة من الأكثر تخصيصاً إلى الأكثر عمومية.

2.3 إدارة القيمة الافتراضية (Default Parameter)

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

في الممارسات التحليلية المتقدمة، يُنصح دائماً بضبط القيمة الافتراضية بشكل صريح لتكون إما قيمة تصنيفية محددة تسمى “أخرى” (Other / Unclassified)، أو قيمة مفقودة صريحة مثل numpy.nan أو pd.NA. هذا التعيين الصريح يمنح المحلل القدرة على التدقيق اللاحق في البيانات واكتشاف ما إذا كانت هناك حالات شاذة أو قيم غير متوقعة لم تغطها الشروط المنطقية المسبقة.

يجب دراسة الآثار النمطية للقيمة الافتراضية على الهيكل النهائي للعمود؛ فاستخدام numpy.nan كقيمة افتراضية في عمود ذي قيم عددية صحيحة سيؤدي حتماً في الإصدارات القديمة من بانداس إلى تحويل العمود بأكمله إلى أرقام عشرية ذات فاصلة عائمة (Float64)، نظراً لأن المعيار القياسي لنمباي يعامل NaN كقيمة عشرية، وهو ما يتطلب تدخلاً لاحقاً لضبط الأنماط عبر أنواع البيانات القابلة للقيم الفارغة (Nullable Types).

3. التطبيق العملي: تصنيف بيانات الأداء الرياضي خطوة بخطوة

3.1 بناء هيكل البيانات الأولي وإعداده

لتجسيد المفاهيم السابقة في سياق واقعي ملموس، سنقوم بإنشاء سيناريو تطبيقي يعتمد على تحليل بيانات الأداء الرياضي لفرق ولاعبين متعددي المهارات. يتضمن إطار البيانات التجريبي متغيرات فئوية ورقمية تشمل اسم الفريق (Team)، وعدد النقاط المسجلة (Points)، ومعدل المساعدات الحاسمة (Assists)، وعدد الدقائق الملعوبة (Minutes). يتيح هذا التنوع تطبيق شروط متعددة الأبعاد تحاكي السيناريوهات الحقيقية المعقدة في بيئات العمل الاحترافية.

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

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

3.2 صياغة الشروط المنطقية المركبة وتطبيق دالة np.select

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

نقوم بتعريف قائمة الشروط conditions كمصفوفة تحتوي على السلاسل البولية المحاطة بالأقواس، ثم ننشئ قائمة الاختيارات choices متضمنة التصنيفات النصية المقابلة لكل شرط بدقة تامة. يتم بعد ذلك استدعاء np.select(conditions, choices, default='احتياطي / عادي') وإسناد المخرجات الناتجة مباشرة إلى عمود جديد في إطار البيانات يُطلق عليه اسم Performance_Tier.

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

3.3 التحقق من صحة النتائج والمطابقة المنطقية

لا تكتمل عملية التعيين الشرطي دون إجراء تدقيق نوعي وكمي صارم للمخرجات للتأكد من انعدام الأخطاء المنطقية. تبدأ هذه الخطوة بأخذ عينات عشوائية طبقية من إطار البيانات باستخدام df.sample(n=10) ومراجعة كل صف يدوياً لمقارنة قيمه الأصلية في أعمدة المدخلات مع التصنيف المشتق في العمود الجديد، مما يضمن توافق التنفيذ البرمجي مع النوايا التحليلية.

يُعد استخدام دالة df['Performance_Tier'].value_counts(dropna=False) أداة فحص لا غنى عنها لتقييم التوزيع التكراري للفئات المشتقة. يساعد هذا التوزيع في كشف الشروط التي قد تكون صيغت بشكل فضفاض للغاية فاستحوذت على معظم البيانات، أو الشروط شديدة الصرامة التي لم تسجل أي ظهور. كما يكشف حجم الفئة الافتراضية، مما يعطي مؤشراً حول مدى شمولية الشروط الأولية لحالات البيانات المتنوعة.

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

4. التعامل مع العمليات البولية المتقدمة والمتداخلة

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

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

تكتسب إدارة شروط النفي باستخدام المعامل ~ (Tilde) أهمية خاصة عند استبعاد فئات معقدة أو نفي شروط مركبة. يتطلب استخدام النفي فهماً دقيقاً لقوانين دي مورغان (De Morgan’s Laws) في المنطق الرياضي؛ فنفي تقاطع شرطين ~(A & B) يكافئ منطقياً اتحاد نفي كل منهما (~A) | (~B). الوقوع في الخلط بين هذه العلاقات المنطقية يؤدي إلى فتح ثغرات تصنيفية غير مقصودة تؤثر سلباً على جودة المخرجات.

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

4.2 تطبيق الشروط المستندة إلى النطاقات والاحتواء (isin و between)

توفر مكتبة بانداس دوال مساعدة مدمجة عالية الأداء لتبسيط صياغة الشروط البولية الشائعة. تبرز دالة Series.between() كبديل أنيق وعالي الكفاءة لكتابة مقارنات النطاقات المزدوجة؛ فبدلاً من كتابة (df['points'] >= 10) & (df['points'] <= 25)، يمكن اختصارها إلى df['points'].between(10, 25, inclusive='both')، مما يعزز مقروئية التعبير ويقلل من احتمالية الأخطاء المطبعية في تكرار أسماء الأعمدة.

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

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

5. البدائل المنهجية: استخدام دالة numpy.where المتداخلة

5.1 بنية دالة np.where للتفرع الثنائي

تُمثل دالة numpy.where المعادل المتجهي المباشر للمعامل الشرطي الثلاثي (Ternary Operator: condition ? x : y) الموجود في لغات البرمجة منخفضة المستوى. تأخذ الدالة ثلاثة وسائط أساسية: المصفوفة الشرطية البولية، والقيمة المسترجعة في حال تحقق الشرط (True)، والقيمة المسترجعة في حال عدم تحققه (False). تكمن قوتها في معالجة مصفوفات كاملة بسرعة خوارزمية مذهلة تضاهي سرعة المعالجة في لغة C.

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

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

5.2 تداخل دوال np.where للتعامل مع الشروط المتعددة

عندما تزداد متطلبات التحليل لتشمل أكثر من شرطين، يلجأ بعض المطورين إلى تقنية التداخل الهيكلي لدوال np.where المتعددة. تتم هذه العملية عن طريق تمرير استدعاء جديد لدالة np.where في الوسيط الثالث (حالة الخطأ / False) للاستدعاء الخارجي، محاكين بذلك البنية التفرعية المتسلسلة if-else if-else التقليدية في لغات البرمجة.

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

من منظور هندسة البرمجيات النظيفة، يُعتبر التداخل العميق لدوال where نمطاً غير محبذ (Code Smell) في بيئات الإنتاج الاحترافية. يجب حصر استخدام np.where في التفرعات الثنائية البسيطة، بينما يجب تفضيل numpy.select بشكل قاطع بمجرد ظهور حاجة لثلاثة شروط أو أكثر، لضمان وضوح الكود وتسهيل مراجعته من قبل فرق العمل المشتركة.

6. التطبيق الشرطي باستخدام apply ودوال Python المخصصة

6.1 تصميم دوال مخصصة تستخدم جمل if-elif-else القياسية

يظل استخدام دالة DataFrame.apply() مع الدوال المخصصة خياراً شائعاً ومألوفاً لدى قطاع واسع من مبرمجي بايثون. يعتمد هذا النهج على كتابة دالة بايثون قياسية تستقبل صف البيانات كاملاً (ككائن Series)، وتستخدم في داخلها جمل التفرع الشرطي الاعتيادية if-elif-else بكل مرونتها البرمجية، ثم تُرجع القيمة التصنيفية المطلوبة بناءً على المنطق المحدد.

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

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

6.2 استخدام دوال Lambda المجهولة للتصنيف السريع

يلجأ المطورون أحياناً إلى ضغط المنطق الشرطي في سطر واحد أنيق باستخدام الدوال المجهولة Lambda Expressions بالتزامن مع apply. يمكن صياغة التعبير الشرطي الثلاثي داخل دالة لامبدا على النحو التالي: df.apply(lambda row: 'A' if row['col'] > 10 else ('B' if row['col'] > 5 else 'C'), axis=1).

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

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

7. رسم الخرائط الشرطية والقواميس عبر map و replace و case_when

7.1 استخدام قواميس المطابقة مع دوال map و replace

عندما تكون الشروط المتعددة مبنية على مطابقة قيم مفردة ثابتة أو فئات نصية محددة بدقة دون الحاجة لمقارنات عدم مساواة أو نطاقات رياضية، تبرز دالتا Series.map() وSeries.replace() كأدوات فائقة الكفاءة. يعتمد هذا النمط على تعريف قاموس بايثون قياسي (Dictionary) يربط القيم الأصلية (المفاتيح) بالتصنيفات الجديدة المقابلة (القيم).

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

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

7.2 استخدام دالة Series.case_when في إصدارات Pandas الحديثة

شهد إصدار بانداس 2.2.0 نقلة نوعية طال انتظارها تمثلت في تقديم دالة Series.case_when(). استُحدثت هذه الدالة لتكون المعادل الأصيل المباشر لعبارات CASE WHEN المعيارية في لغة SQL وتراكيب دالة case_when الشهيرة في مكتبة dplyr في لغة R، مستهدفة توحيد الصياغة الشرطية داخل إطار عمل بانداس النقي دون الحاجة للاعتماد الخارجي على مكتبة نمباي.

تعتمد البنية النحوية لـ case_when على استقبال قائمة من أزواج الشروط والنتائج المنظمة في هيئة أزواج صفية (Tuples)، حيث يتكون كل زوج من مصفوفة شرطية بولية متبوعة بالقيمة أو السلسلة المستهدفة: caselist = [(cond1, val1), (cond2, val2)]. يتم استدعاء الدالة مباشرة على السلسلة الأساسية التي تمثل القيمة الافتراضية في حال عدم تحقق أي من الشروط، مثل: df['default_col'].case_when(caselist).

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

8. معالجة القيم المفقودة (NaN) والاستثناءات في الشروط المتعددة

8.1 تأثير القيم المفقودة على تقييم الشروط البولية

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

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

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

8.2 استراتيجيات فرض أنواع البيانات (Type Casting) بعد التعيين الشرطي

غالباً ما تسفر عمليات التعيين الشرطي عن تغيرات غير متوقعة في أنواع البيانات التخزينية (Data Types Mutation). من أبرز هذه الظواهر تحول الأعمدة العددية الصحيحة إلى أرقام عشرية ذات فاصلة عائمة لمجرد احتواء العمود الجديد على قيم مفقودة متمثلة في np.nan. يرجع ذلك إلى القيود التاريخية في نمباي التي تفتقر لمفهوم العدد الصحيح القابل للفقدان (Nullable Integer).

للتغلب على هذه المعضلة وتأمين اتساق الهيكل البياني، استحدثت مكتبة بانداس منظومة متكاملة من أنواع البيانات الموسعة والمخصصة للقيم القابلة للفقدان. يمكن بعد اكتمال التعيين الشرطي استخدام دالة astype() لفرض الأنماط الصريحة والحديثة مثل 'Int64' (بحرف I كبير) للأعداد الصحيحة التي تتضمن قيماً مفقودة، أو 'string' للسلاسل النصية بدلاً من النمط العام غير الفعال object.

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

9. تحليل الأداء والمقارنة المعيارية (Benchmarking) بين الأساليب

9.1 مقارنة زمن التنفيذ بين np.select و np.where و apply

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

تُظهر النتائج التجريبية تفوقاً كاسحاً للأساليب المتجهية؛ حيث تحقق دالتا numpy.select وnumpy.where المتداخلة سرعات تنفيذ متقاربة تتفوق بأكثر من 50 إلى 100 ضعف مقارنة باستخدام DataFrame.apply() مع الدوال المخصصة. يرجع هذا التباين الشاسع إلى قدرة نمباي على تنفيذ الحلقات التكرارية على مستوى لغة C المجمعة والتعامل مع مساحات الذاكرة المتجاورة (Contiguous Memory Blocks)، متجنبة التعطيل الناجم عن قفل المفسر العام (GIL – Global Interpreter Lock).

تتضح نقطة التحول الحجمية (Threshold Point) عندما يتجاوز حجم البيانات 100,000 صف. في هذه النطاقات وما فوقها، يصبح الاعتماد على دوال apply أو iterrows غير ممكن عملياً نظراً للارتفاع الهائل في زمن الاستجابة واستهلاك الموارد الحسابية، مما يفرض استخدام numpy.select أو Series.case_when كمعيار إلزامي غير قابل للتفاوض في بنية هندسة البيانات.

9.2 كفاءة استهلاك الذاكرة وإدارة الموارد الحاسوبية

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

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

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

10. الأنماط المتقدمة: التوليد الديناميكي للشروط المنطقية

10.1 بناء قوائم الشروط برمجياً استناداً إلى معطيات متغيرة

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

يمكن تحقيق هذا النمط المتقدم عبر استخدام تراكيب الفهم بالقوائم (List Comprehensions) وحلقات التوليد البرمجي. على سبيل المثال، إذا كان ملف التكوين يحتوي على قائمة من القواعد تتضمن اسم العمود والمعامل الحسابي والقيمة الحدية والتصنيف المقابل، يمكن قراءة هذا الملف في حلقة تكرارية تبني كائنات الشروط البولية وتضيفها تسلسلياً إلى قائمة conditions وقائمة choices، ثم تمريرها مباشرة إلى np.select.

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

10.2 استخدام دالة DataFrame.eval و DataFrame.query للتعبير الشرطي النصي

توفر مكتبة بانداس محرك تقييم تعبيري فائق السرعة يعتمد على مكتبة NumExpr عبر دالتي DataFrame.eval() وDataFrame.query(). يتيح هذا المحرك كتابة التعبيرات الشرطية المعقدة في هيئة سلاسل نصية بسيطة تُنفذ مباشرة على مساحات الذاكرة المؤقتة لوحدة المعالجة المركزية (CPU Caches)، مما يوفر تسريعاً مذهلاً وتوفيراً كبيراً في استهلاك الذاكرة لمجموعات البيانات المليونية.

يمكن صياغة التعيين الشرطي باستخدام eval() عبر تمرير سلاسل نصية تحتوي على الشروط والحسابات دفعة واحدة، مثل: df.eval("Score = (Points * 1.5) + (Assists * 2)") متبوعة بسلسلة شروط استعلامية. يقلل هذا الأسلوب من الحاجة لتكرار اسم إطار البيانات df[...] عدة مرات، مما يجعل الكود شديد الشبه بالاستعلامات الرياضية الصافية والواضحة.

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

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

11.1 أخطاء الترتيب المنطقي وتداخل الشروط (Condition Overlapping)

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

لتجنب هذا الفخ المنطقي، يجب اتباع المبدأ الرياضي المعروف بـ “الشمولية والتنافي المتبادل” (MECE – Mutually Exclusive and Collectively Exhaustive). يتطلب هذا المبدأ صياغة الشروط بحيث لا تتقاطع نطاقاتها بشكل عشوائي، والحرص دائماً على ترتيب الشروط ترتيباً تنازلياً يبدأ من أدق الحالات وأكثرها صرامة وتخصيصاً، وصولاً إلى الحالات الأكثر عمومية وشمولاً في نهاية القائمة.

يُنصح في مراحل التطوير المتقدمة برسم وتوثيق “جداول الحقيقة” (Truth Tables) أو مخططات شجرية لتغطية كافة الاحتمالات الممكنة لتقاطع المتغيرات. يساعد هذا التحليل البصري والرياضي المسبق في كشف الفجوات المنطقية والتأكد من أن كل سجل بياني سيسلك المسار الصحيح المخصص له دون أي غموض أو انحياز حسابي غير مقصود.

11.2 أخطاء عدم تطابق الأبعاد والأنماط واستراتيجيات التصحيح

يواجه المطورون في كثير من الأحيان الخطأ الشهير ValueError: shape mismatch: list of conditions and choices must have the same length. يحدث هذا الخطأ ببساطة عندما يكون عدد العناصر في قائمة الشروط conditions غير مساوٍ تماماً لعدد العناصر في قائمة المخرجات choices، أو عند تمرير مصفوفة شرطية ذات طول لا يتطابق مع إجمالي عدد صفوف إطار البيانات المستهدف نتيجة عمليات ترشيح سابقة غير متسقة.

خطأ آخر شائع يتمثل في إهمال الأقواس حول المقارنات الفردية، والذي يقود إلى رسالة الخطأ الغامضة TypeError: cannot compare a dtyped [float64] array with a scalar of type [bool]. يعود سبب ذلك، كما أشرنا سابقاً، إلى قيام المعامل الثنائي & بتقييم المعاملات قبل انتهاء مقارنات الأعداد، ويكمن حله الجذري في التأكد الدائم من تطويق كل مقارنة مستقلة بأقواس محكمة (df['A'] > 0) & (df['B'] < 5).

تقتضي أفضل ممارسات هندسة البرمجيات تضمين اختبارات تأكيدية (Assertions) واختبارات وحدية (Unit Tests) للتحقق التلقائي من مخرجات العمود الجديد. يمكن استخدام توكيدات بايثون الصريحة مثل assert df['new_col'].notna().all() للتأكد من عدم تولد قيم فارغة غير متوقعة، أو استخدام مكتبات فحص الجودة المتقدمة لضمان بقاء البيانات مطابقة للمواصفات المعمارية القياسية قبل دفعها إلى بيئات الإنتاج.

12. أفضل الممارسات البرمجية وتكامل الشروط في خطوط المعالجة

12.1 كتابة كود نظيف وقابل للصيانة والتوثيق (Clean Code)

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

يجب التخلي تماماً عن استخدام أسماء المتغيرات الغامضة واستبدالها بأسماء تعبيرية ودلالية تعكس المنطق التحليلي بوضوح. فبدلاً من تسمية المتغيرات c1, c2, c3، يجب استخدام أسماء واضحة مثل is_top_tier_scoring, is_mid_level_passing, is_low_participation. هذا التوثيق الذاتي للكود يلغي الحاجة للتعليقات المطولة ويجعل مراجعة النظراء البرمجية (Peer Review) عملية سريعة وسلسة وموثوقة.

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

12.2 دمج التعيين الشرطي داخل خطوط أنابيب التحويل (Data Pipelines)

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

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

يضمن هذا التكامل المعماري استقرار وموثوقية خطوط الأنابيب البرمجية في بيئات الإنتاج الحية (Production Environments)؛ حيث تصبح العمليات التحويلية مقاومة للتغيرات غير المتوقعة في أحجام أو هياكل البيانات القادمة، وتسهل مراقبتها وتسجيل أخطائها عبر أنظمة المراقبة والسجلات المركزية (Logging and Monitoring Pipelines) بكل كفاءة واحترافية.

خاتمة

استعرضنا في هذا الدليل المتعمق المشهد الشامل لتقنيات إنشاء الأعمدة المشروطة بتفرعات if-else المتعددة في بيئة بانداس وبايثون. لقد تبين بوضوح أن الانتقال من التفكير الإجرائي القائم على الحلقات التكرارية ودوال apply السطرية إلى التفكير المتجهي القائم على أدوات مثل numpy.select وnumpy.where ودالة بانداس الحديثة Series.case_when يمثل حجر الزاوية في بناء حلول هندسة بيانات سريعة، مستقرة، وقابلة للتوسع الحسابي الهائل.

إن الاختيار الرشيد للأداة المناسبة يعتمد بالدرجة الأولى على طبيعة البيانات وحجمها ودرجة تعقيد الشروط المنطقية؛ فبينما تظل numpy.where الحل الأمثل للتفرعات الثنائية، تتربع numpy.select وcase_when على قمة الحلول المثلى للتصنيفات المتعددة المعقدة، مع الاحتفاظ بـ map للحالات القائمة على مطابقة القواميس الثابتة. إن تطبيق أفضل الممارسات في كتابة الكود النظيف، ومراعاة الأسبقية المنطقية، والمعالجة الدقيقة للقيم المفقودة، وفرض الأنماط البيانية المناسبة يضمن جميعاً إنتاج خطوط أنابيب معالجة بيانات ترتقي إلى أعلى معايير الجودة والاحترافية البرمجية.

References

  • McKinney, W. (2022). Python for Data Analysis: Data Wrangling with pandas, NumPy, and Jupyter (3rd ed.). O’Reilly Media. https://wesmckinney.com/book/
  • 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
  • The pandas development team. (2024). pandas documentation: Essential basic functionality & Indexing and selecting data (Version 2.2). PyData. https://pandas.pydata.org/docs/
  • NumPy Developers. (2024). NumPy v1.26 Manual: Mathematical functions and logic functions (numpy.select & numpy.where). NumPy.org. https://numpy.org/doc/stable/reference/routines.logic.html
  • VanderPlas, J. (2016). Python Data Science Handbook: Essential Tools for Working with Data. O’Reilly Media. https://jakevdp.github.io/PythonDataScienceHandbook/
  • Martin, R. C. (2008). Clean Code: A Handbook of Agile Software Craftsmanship. Prentice Hall.

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

looti, M. (2026, سبتمبر 2). بانداس: إنشاء عمود جديد باستخدام شروط If Else المتعددة. عرب سايكلوجي. https://arabpsychology.com/pandas-create-new-column-multiple-if-else-conditions/
looti, Mohammed. “بانداس: إنشاء عمود جديد باستخدام شروط If Else المتعددة.” عرب سايكلوجي, 2 سبتمبر 2026, https://arabpsychology.com/pandas-create-new-column-multiple-if-else-conditions/.
looti, Mohammed. “بانداس: إنشاء عمود جديد باستخدام شروط If Else المتعددة.” عرب سايكلوجي. سبتمبر 2, 2026. https://arabpsychology.com/pandas-create-new-column-multiple-if-else-conditions/.