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

كيفية حذف الأعمدة في بانداز (4 أمثلة)

دليل أكاديمي شامل يشرح كيفية حذف الأعمدة في مكتبة بانداز (Pandas) عبر 4 أمثلة عملية مع تحليل دقيق للمعاملات وإدارة الذاكرة والأداء البرمجي.

تاريخ النشر

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

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

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

1. مقدمة شاملة حول مكتبة بانداز وهياكل بيانات إطار البيانات (DataFrame)

1.1 أهمية مكتبة بانداز في بيئة تحليل البيانات البرمجية

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

يلعب إطار البيانات ثنائي الأبعاد المعروف باسم (DataFrame) دور العمود الفقري في تنظيم وتصنيف المتغيرات ذات الأنواع غير المتجانسة، حيث يسمح بدمج الأعمدة النصية والرقمية والزمنية والمنطقية داخل كائن برمجي واحد متماسك. وتعتبر عمليات تنقيح البيانات وهندستها، لا سيما استبعاد وحذف الأعمدة غير الضرورية، خطوة محورية في خط أنابيب هندسة البيانات (Data Pipelines). إن إزالة الأعمدة غير المرتبطة بالتحليل يساهم في تقليل الأبعاد الرياضية لمصفوفة الميزات، مما يمنع ظاهرة “لعنة الأبعاد” (Curse of Dimensionality) ويقلل من استهلاك الموارد الحاسوبية أثناء تدريب الخوارزميات، فضلاً عن تعزيز القابلية التفسيرية للنتائج المستخلصة.

1.2 المفاهيم الهيكلية لصفوف وأعمدة إطار البيانات

يتألف إطار البيانات في بانداز من بنية متقدمة تشمل محورين أساسيين: المحور الرأسي الممثل للصفوف أو الملاحظات، والمحور الأفقي الممثل للأعمدة أو المتغيرات. ويختلف إطار البيانات بنيوياً عن السلاسل (Series)، حيث تمثل السلسلة مصفوفة أحادية البعد تمتلك فهرساً تصنيفياً موحداً، بينما يعد إطار البيانات تجميعاً متسقاً من السلاسل المتوازية التي تشترك في فهرس الصفوف وتتمايز في فهارس الأعمدة. يعتمد نظام العنونة في بانداز على بنية فهرسية مزدوجة تسمح بالوصول المباشر للمتغيرات إما عبر التسميات النصية الصريحة (Explicit Labels) أو عبر المواضع الرقمية النسبية (Positional Integers)، مما يوفر مرونة برمجية فائقة عند استهداف خلايا أو قطاعات محددة.

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

2. البنية البرمجية الأساسية لدالة ()drop والمعاملات الجوهرية

2.1 التوقيع البرمجي (Syntax Signature) لدالة drop

تمثل دالة drop() الأداة البرمجية المعتمدة والأكثر شمولاً داخل كائنات DataFrame لإجراء عمليات الاستبعاد الهيكلي للمكونات الجدولية. يتميز التوقيع البرمجي للدالة بدرجة عالية من التجريد الرياضي والمرونة، حيث يستقبل مجموعة متكاملة من المعاملات المحددة لسلوك الحذف، وتأخذ الصيغة العامة التوقيع التالي: DataFrame.drop(labels=None, axis=0, index=None, columns=None, level=None, inplace=False, errors='raise'). صُممت هذه المعاملات لتمنح المبرمج قدرة فائقة على التحكم في اتجاه العملية، وآلية التعامل مع الاستثناءات، وطريقة إدارة الذاكرة الناتجة عن عملية التنفيذ.

يحمل المعامل labels القيمة الافتراضية None، ويُستخدم لتمرير التسمية المفردة أو القائمة النصية المستهدفة، بالاقتران مع تحديد المحور عبر axis. وفي المقابل، يتيح المعاملان index و columns تحديداً صريحاً ومباشراً للمحور دون الحاجة لاستخدام المعامل axis. أما المعامل level فيختص بإطارات البيانات ذات الفهارس الهرمية المتعددة (MultiIndex)، بينما يتحكم inplace في طبيعة تطبيق العملية على الكائن الأصلي، ويحدد errors (بقيمه الممكنة 'raise' أو 'ignore') ما إذا كان البرنامج سيتوقف عند مواجهة اسم غير موجود أو سيتجاهل الخطأ ويستمر في التنفيذ. تعكس هذه البنية المعمارية تكاملاً دقيقاً يلبي الاحتياجات البرمجية البسيطة والسيناريوهات الإنتاجية المعقدة.

2.2 آلية تحديد المتغير المستهدف للحذف برمجياً

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

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

3. التحليل العميق لمعاملات التحكم: دراسة المحور (axis) والتعديل الموضعي (inplace)

3.1 الفهم المعماري لمعامل المحور (axis=1 مقابل axis=0)

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

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

3.2 معامل التعديل في المكان (inplace=True): المزايا والمحاذير

يتحكم المعامل المنطقي inplace في آلية تخصيص الذاكرة عند تطبيق عمليات التحويل على كائنات إطار البيانات. افتراضياً، يحمل هذا المعامل القيمة False، مما يعني أن دالة drop ستقوم بإنشاء نسخة جديدة معدلة بالكامل من إطار البيانات في الذاكرة العشوائية، مع إبقاء الكائن الأصلي دون أي تغيير. يتيح هذا السلوك الحفاظ على سلامة البيانات الأصلية وتطبيق مبدأ البرمجة الوظيفية (Functional Programming)، مما يسمح بربط العمليات البرمجية في سلسلة استدعاء متصلة (Method Chaining) تزيد من أناقة الشيفرة ووضوحها.

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

4. إعداد بيئة العمل البرمجية وبناء إطار البيانات النموذجي

4.1 استيراد المكتبات وتهيئة بيئة بايثون

يتطلب الشروع في تطبيق عمليات حذف الأعمدة تهيئة بيئة العمل البرمجية بالشكل السليم من خلال استيراد الأدوات البرمجية المعيارية. يتم استدعاء مكتبة بانداز عبر الاسم الاصطلاحي الموحد عالمياً import pandas as pd، إلى جانب استدعاء مكتبة NumPy عبر الرمز import numpy as np لتسهيل التعامل مع المصفوفات الرياضية والقيم المفقودة في حال الحاجة إليها. يساهم الالتزام بهذه التسميات الاصطلاحية في توحيد لغة التخاطب البرمجي وضمان توافقية الشيفرة عبر المنصات وبيئات التطوير التفاعلية مثل Jupyter Notebooks و Google Colab.

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

4.2 إنشاء إطار البيانات المرجعي (df) للتطبيق العملي

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

تتم هيكلة البيانات في القاموس على النحو التالي: يحتوي العمود الأول ‘A’ على القيم [10, 20, 30, 40]، ويحتوي العمود الثاني ‘B’ على القيم [100, 200, 300, 400]، بينما يضم العمود الثالث ‘C’ القيم [1000, 2000, 3000, 4000]. عند تمرير هذا القاموس إلى الباني pd.DataFrame(data)، يتشكل لدينا إطار بيانات مستطيل بأبعاد تبلغ 4 صفوف و 3 أعمدة (4×3)، ويمتلك فهرساً رقمياً يبدأ من الصفر (RangeIndex: 0 to 3). تتيح هذه البنية المتسقة متابعة التغيرات المترتبة على استخدام دوال الحذف بصرياً ورياضياً بدقة متناهية.

5. المثال الأول: حذف عمود واحد بالاعتماد على الاسم (Drop One Column by Name)

5.1 الصياغة البرمجية لحذف عمود مفرد باسمه

يُعد استهداف عمود مفرد عبر اسمه الصريح السيناريو الأكثر شيوعاً في المعالجة اليومية للبيانات. لتحقيق ذلك، نطبق الدالة drop مع تمرير التسمية النصية للعمود المستهدف وتحديد المحور المناسب. إذا رغبنا في حذف العمود ‘A’ بصورة دائمة من إطار البيانات النموذجي، تتم كتابة الشيفرة البرمجية وفق النمط التالي: df.drop('A', axis=1, inplace=True). يقوم المفسر بالبحث عن العمود ذي التسمية ‘A’ على امتداد المحور الأفقي واستبعاده فورياً من الهيكل الداخلي للكائن.

كبديل منهجي حديث يعزز القراءة الذاتية للكود البرمجي، يمكن استخدام الصياغة المعتمدة على المعامل الصريح: df.drop(columns='A', inplace=True). تلغي هذه الصيغة الحاجة لتحديد axis=1 يدوياً، حيث يتولى البناء الداخلي للدالة توجيه الحذف مباشرة إلى فهرس الأعمدة. في حال عدم الرغبة في التعديل الموضعي والاعتماد على ممارسات البرمجة غير التبادلية (Immutable Patterns)، يمكن استخدام أسلوب إعادة الإسناد: df_cleaned = df.drop(columns='A')، مما يولد إطار بيانات جديداً يحمل الاسمين ‘B’ و ‘C’ فقط، مع بقاء الكائن df الأصلي محتفظاً بجميع أعمدته الثلاثة في الذاكرة.

5.2 التحقق الرياضي والبرمجي من مخرجات الحذف الفردي

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

بالإضافة إلى التحقق البعدي، يُظهر فحص الفهرس عبر df.columns أن القائمة المتبقية أصبحت تقتصر على الفهرس Index(['B', 'C'], dtype='object'). ويؤكد استعراض محتوى إطار البيانات أن القيم المخزنة داخل العمودين ‘B’ و ‘C’ لم تتعرض لأي إزاحة أو تحريف مكاني، حيث تظل العلاقة الارتباطية بين الفهارس الرقمية للصفوف وقيم المتغيرات المتبقية مطابقة تماماً للحالة الأصلية، مما يبرهن على الدقة الرياضية لعمليات الحذف في بانداز.

6. المثال الثاني: حذف أعمدة متعددة باستخدام قائمة الأسماء (Drop Multiple Columns by Name)

6.1 بناء مصفوفة الأسماء وتمريرها للدالة

في كثير من التطبيقات المتقدمة، تقتضي الحاجة استبعاد عدة متغيرات دفعة واحدة، مثل إزالة حقول التعريف الشخصية أو الأعمدة المكررة. تتيح بانداز إجراء هذا الحذف المتعدد بمنتهى السلاسة من خلال تمرير مصفوفة أو قائمة نصية (Python List) تحتوي على كافة الأسماء المراد استبعادها. إذا أردنا حذف العمودين ‘A’ و ‘B’ معاً من إطار البيانات الأصلي، نقوم بصياغة الاستدعاء كالتالي: df.drop(['A', 'B'], axis=1, inplace=True).

تتعامل الدالة مع القائمة الممررة كوحدة معالجة كلية؛ حيث تقوم بمطابقة كل عنصر في القائمة مع فهرس الأعمدة الداخلي، وتجهيز خطة إزالة موحدة يتم تطبيقها في خطوة ذرية واحدة. ويمكن صياغة العملية ذاتها عبر المعامل الصريح بالشكل: df.drop(columns=['A', 'B'], inplace=True). ينتج عن هذه العملية تقليص مباشر للبنية الجدولية بحيث لا يتبقى في إطار البيانات سوى العمود ‘C’ بمصفوفته العددية الأصلية [1000, 2000, 3000, 4000]، مما يوفر صياغة برمجية مقتضبة وواضحة للغاية دون الحاجة لتكرار استدعاء الدالة لكل عمود على حدة.

6.2 إدارة العمليات التكرارية وتقليل تكلفة المعالجة

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

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

7. المثال الثالث: حذف عمود واحد بالاعتماد على موضع الفهرس (Drop One Column by Index)

7.1 الوصول الموضعي لأسماء الأعمدة عبر سمة df.columns

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

إذا رغبنا في حذف العمود الأول من إطار البيانات النموذجي بغض النظر عن اسمه، نقوم باستخراج اسمه عبر التعبير الموضعي df.columns[[0]] وتمريره مباشرة إلى دالة الحذف بالصيغة التالية: df.drop(df.columns[[0]], axis=1, inplace=True). يقوم التعبير الداخلي بإرجاع كائن فهرسي يحتوي على التسمية المقابلة للموقع الصفري (وهي ‘A’ في مثالنا المرجعي)، ومن ثم تستقبل دالة drop هذا الاسم وتنفذ عملية الحذف بصورة طبيعية، مما يدمج بين مرونة الاستهداف الموضعي ودقة الحذف الاسمي.

7.2 حالات الاستخدام الأكاديمي للحذف القائم على الفهرس

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

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

8. المثال الرابع: حذف أعمدة متعددة بالاعتماد على قائمة الفهارس (Drop Multiple Columns by Index)

8.1 صياغة التحديد الموضعي المتعدد للفهارس

يمتد مبدأ الحذف الموضعي ليشمل إمكانية استبعاد عدة أعمدة متفرقة أو متتالية بالاعتماد على قائمة من الأرقام الترتيبية. يتحقق ذلك بتمرير قائمة من الفهارس الصحيحة داخل الأقواس المزدوجة لخاصية الأعمدة: df.columns[[0, 2]]. يشير هذا التعبير إلى استهداف العمود الأول (الموضع 0 المقابل للمتغير ‘A’) والعمود الثالث (الموضع 2 المقابل للمتغير ‘C’) في إطار البيانات النموذجي.

يتم تنفيذ الاستدعاء البرمجي المتكامل وفق الصيغة الآتية: df.drop(df.columns[[0, 2]], axis=1, inplace=True). يقوم المفسر باستخلاص التسميات المقابلة لتلك المواقع دفعة واحدة، وتمريرها كمصفوفة أسماء إلى دالة drop، مما يؤدي إلى استبعاد العمودين ‘A’ و ‘C’ معاً والإبقاء فقط على العمود الأوسط ‘B’. تُعد هذه الطريقة مثالية عند الرغبة في التخلص من أطراف مصفوفة البيانات أو استبعاد متغيرات متباعدة المواقع وفق خطة هندسية محددة سلفاً بأقل عدد ممكن من الأسطر البرمجية.

8.2 استخدام تقنيات التقطيع (Slicing) مع مصفوفات الفهارس

عندما تكون الأعمدة المستهدفة بالحذف واقعة ضمن نطاق ترتيبي متصل، تبرز تقنية تقطيع القوائم (List Slicing) كأداة هندسية بالغة القوة والاختصار. يتيح استخدام صيغة التقطيع df.columns[start:stop] استخراج نطاق كامل من الأعمدة دون الحاجة لسرد أرقامها الفردية. على سبيل المثال، التعبير df.columns[0:2] يستخرج أسماء الأعمدة من الموضع 0 حتى الموضع 1 (مع استبعاد الحد الأقصى 2 وفق قواعد بايثون المعيارية)، مما يمثل العمودين ‘A’ و ‘B’.

يمكن دمج هذا النطاق المقتطع بسلاسة داخل أمر الحذف: df.drop(df.columns[0:2], axis=1, inplace=True)، مما يؤدي إلى حذف كامل النطاق المستهدف دفعة واحدة. تتميز هذه الاستراتيجية بقدرتها الفائقة على تصفية إطارات البيانات الكبيرة التي تحتوي على مئات المتغيرات المصنفة في قطاعات متجاورة، مع ضمان عدم حدوث أي إزاحة غير مقصودة في فهارس الأعمدة المتبقية، حيث تتم عمليات إعادة الفهرسة الداخلية تلقائياً وبأقصى درجات الدقة الحسابية.

9. المقارنة بين استراتيجيات الحذف البديلة في بيئة بانداز

9.1 الحذف باستخدام الكلمات المفتاحية للبايثون: del و pop

توفر لغة بايثون ومكتبة بانداز آليات إضافية لحذف الأعمدة تختلف في فلسفتها وأدائها المعماري عن دالة drop()، ومن أبرزها الكلمة المفتاحية del ودالة الاستخراج pop(). يُستخدم الأمر del df['A'] لتنفيذ حذف موضعي فوري ومباشر للعمود من إطار البيانات دون إنشاء أي نسخ وسيطة. ورغم سرعته وبساطته، إلا أن عيبه الجوهري يكمن في افتقاره للمرونة، حيث لا يقبل سوى اسم عمود واحد فقط في كل استدعاء، ولا يمكن استخدامه ضمن سلاسل الاستدعاء المتصلة.

من ناحية أخرى، تقدم دالة df.pop('A') سلوكاً مزدوجاً فريداً مستوحى من هياكل بيانات المكدس (Stack)؛ فهي تقوم بحذف العمود المستهدف من إطار البيانات الأصلي مباشرة، وفي الوقت ذاته تقوم بإرجاع ذلك العمود المحذوف ككائن من نوع Series يمكن تخزينه في متغير مستقل لاستخدامه لاحقاً (مثل استخراج المتغير المستهدف وتخصيصه لتدريب نموذج رياضي). يوضح الجدول التحليلي التالي مقارنة شاملة بين هذه الأساليب البرمجية:

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

9.2 التصفية العكسية باستخدام محددات الفهرسة loc و iloc

في العديد من سيناريوهات تنقية البيانات المتقدمة، تكون الاستراتيجية الأكثر كفاءة وأماناً ليست تحديد المتغيرات غير المرغوبة لحذفها، بل تحديد المتغيرات المرغوبة صراحة للاحتفاظ بها، وهو ما يُعرف تقنياً بمفهوم “التصفية العكسية” (Inverted Filtering) أو القوائم البيضاء (Whitelisting). تعتمد هذه المقاربة على محددات الفهرسة القوية في بانداز: loc للاستهداف القائم على التسميات، و iloc للاستهداف الموضعي بالأرقام الصحيحة.

على سبيل المثال، بدلاً من حذف العمود ‘A’، يمكن الاحتفاظ بالعمودين ‘B’ و ‘C’ عبر الشيفرة: df_filtered = df.loc[:, ['B', 'C']]، أو موضعياً عبر: df_filtered = df.iloc[:, 1:3]. توفر هذه المنهجية حماية فائقة ضد التغيرات غير المتوقعة في مصادر البيانات الواردة؛ فإذا ظهرت أعمدة دخيلة أو تالفة في ملف البيانات الخام، فإن آلية التصفية العكسية تضمن استبعادها تلقائياً وعدم السماح إلا للمتغيرات المصرح بها مسبقاً بالمرور إلى النماذج التحليلية اللاحقة، مما يرفع من متانة وموثوقية خطوط المعالجة الإنتاجية.

10. معالجة الاستثناءات والأخطاء الشائعة أثناء حذف الأعمدة

10.1 التعامل مع خطأ مفتاح الفهرس (KeyError)

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

للتعامل المنهجي مع هذا الاستثناء وتفادي انهيار التطبيقات الآلية، توفر بانداز المعامل errors='ignore'. عند كتابة الشيفرة بصيغة: df.drop('NonExistentColumn', axis=1, errors='ignore', inplace=True)، فإن المفسر سيتجاوز الخطأ بسلاسة دون إيقاف البرنامج في حال عدم العثور على الاسم. ومع ذلك، يُفضل في البيئات الأكاديمية والبحثية الصارمة إجراء تحقق استباقي من وجود الأعمدة باستخدام التعبيرات الشرطية، مثل: cols_to_drop = [c for c in target_cols if c in df.columns] ثم تمرير القائمة المصفاة للدالة، لضمان السيطرة الكاملة على تدفق المعالجة وكشف الأخطاء المفاهيمية مبكراً.

10.2 أخطاء تعيين المحاور (Axis Confusion Errors)

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

يتطلب تصحيح هذه الأخطاء قراءة دقيقة للبنية التتبعية لرسائل الأخطاء (Traceback Analysis) لفهم سياق الانقطاع. كما يُوصى المطورون بتطويق العمليات البرمجية الحساسة بكتل المعالجة الوقائية try-except للتعامل مع السيناريوهات الشاذة، إلى جانب الاعتماد الممنهج على الكلمة المفتاحية الصريحة columns=... التي تمنع الوقوع في خطأ المحاور من الأساس، مما يسهم في كتابة شيفرات ذات اعتمادية وموثوقية برمجية عالية قابلة للاختبار والتطوير المستمر.

11. الأبعاد الحاسوبية وإدارة الذاكرة وكفاءة الأداء

11.1 تحليل استهلاك الذاكرة العشوائية (RAM Profile)

تحتفظ كائنات DataFrame في مكتبة بانداز بتمثيلها الذاكري عبر بنية متقدمة من الكتل المصفوفية التي تديرها مكتبة NumPy. لقياس استهلاك الذاكرة الفعلي لإطار البيانات قبل وبعد عمليات حذف الأعمدة بدقة، توفر المكتبة الدالة df.memory_usage(deep=True). يُعد تمرير المعامل deep=True أمراً جوهرياً، إذ يجبر النظام على فحص البنى الداخلية للبيانات النصية (Strings/Objects) وحساب حجم المؤشرات الفعلية في الذاكرة العشوائية، بدلاً من الاقتصار على تقدير المساحة السطحية للمصفوفة.

عند تنفيذ عمليات حذف لأعمدة ذات حمولة بيانية ضخمة دون استخدام inplace=True، تتضاعف متطلبات الذاكرة اللحظية نظراً لوجود الكائن القديم والجديد معاً في الذاكرة حتى تتدخل آلية تنظيف المخرجات في لغة بايثون (Garbage Collector). ولتحرير المساحات المحجوزة فورياً في مشاريع البيانات الكبيرة، يُنصح بحذف الإشارات المرجعية القديمة يدوياً عبر del df_old ثم استدعاء وحدة التنظيف الصريح للذاكرة عبر استيراد مكتبة gc وتنفيذ الأمر gc.collect()، مما يعيد المساحات غير المستغلة لنظام التشغيل ويحمي البيئة من أخطاء نفاد الذاكرة (Out-of-Memory Errors).

11.2 أداء العمليات في مجموعات البيانات الضخمة (Big Data)

تخضع عمليات تحويل وتصفية البيانات لمقاييس التعقيد الزمني (Time Complexity) والحسابي، حيث يتأثر زمن تنفيذ عمليات الحذف مباشرة بحجم إطار البيانات وعدد الصفوف والأعمدة المخزنة. يوضح التحليل المقارن باستخدام وحدة timeit القياسية أن استبعاد الأعمدة عبر استدعاء دالة drop() بقائمة موحدة يمتلك تعقيداً زمنياً يقارب $O(N)$ بالنسبة لعدد الصفوف المتبقية التي يُعاد بناء مؤشراتها، مقارنة بالتعقيد المتكرر $O(K \times N)$ الناتج عن الحذف الفردي المتسلسل لعدد $K$ من الأعمدة.

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

12. الخلاصة وأفضل الممارسات المنهجية لتنقيح البيانات

12.1 دليل اتخاذ القرار لاختيار طريقة الحذف المناسبة

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

  • الحذف بالاسم الصريح (Drop by Name): الخيار المثالي والأكثر أماناً في الأبحاث والتحليلات القياسية عندما تكون أسماء المتغيرات ثابتة ومعروفة مسبقاً، ويُنصح باستخدام df.drop(columns=[...]) لوضوح دلالتها البرمجية.
  • الحذف بالفهرس الرقمي (Drop by Index): الخيار الأنسب للبرامج النصية الآلية وخطوط المعالجة العامة التي تتعامل مع ملفات واردة ديناميكياً بأسماء مجهولة أو أعمدة ترقيم تالفة في مواقع محددة سلفاً.
  • التصفية العكسية (loc/iloc): النهج الهندسي الأفضل للبيئات الإنتاجية الحساسة التي تتطلب فرض قوائم بيضاء صارمة للمتغيرات المصرح بها ومنع أي بيانات غير متوقعة من العبور.
  • استخدام Pop و Del: يُقصر استخدامهما على السيناريوهات المتخصصة؛ كأن يتطلب منطق العمل عزل متغير محدد لاستخدامه كمتجه مستقل، أو عند الرغبة في حذف عمود وحيد بسرعة دون استيراد أدوات إضافية.

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

12.2 قائمة التحقق المعيارية لمطوري ومحللي البيانات

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

  • التحقق من سلامة الأبعاد: فحص df.shape للتأكد من انخفاض عدد الأعمدة بالعدد المتوقع تماماً مع ثبات عدد الصفوف.
  • فحص اتساق أنواع البيانات (Data Types): التحقق عبر df.dtypes لضمان عدم حدوث تحويل قسري غير مقصود في أنواع بيانات الأعمدة المتبقية.
  • تأكيد سلامة الفهارس والمراجع: التأكد من أن العمليات لم تترك مراجع متغيرة معلقة (Broken References) قد تسبب أخطاء لاحقة عند محاولة الوصول لبيانات محذوفة.
  • التكامل مع خطوط الأنابيب: دمج عمليات الحذف والتنقية داخل دوال مخصصة للمعالجة المسبقة (Preprocessing Functions) يسهل اختبارها واختبار وحداتها البرمجية (Unit Testing) بشكل مستقل.

References

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

looti, M. (2026, أغسطس 29). كيفية حذف الأعمدة في بانداز (4 أمثلة). عرب سايكلوجي. https://arabpsychology.com/statistics/how-to-drop-columns-in-pandas-4-examples/
looti, Mohammed. “كيفية حذف الأعمدة في بانداز (4 أمثلة).” عرب سايكلوجي, 29 أغسطس 2026, https://arabpsychology.com/statistics/how-to-drop-columns-in-pandas-4-examples/.
looti, Mohammed. “كيفية حذف الأعمدة في بانداز (4 أمثلة).” عرب سايكلوجي. أغسطس 29, 2026. https://arabpsychology.com/statistics/how-to-drop-columns-in-pandas-4-examples/.