pandas / الأساسي: التسميات والأنواع والمدخل المقبول / الدرس 5
الأعمدة المتجهة والإسناد الآمن
التعبير عن عمليات الأعمدة بوحدات وأقنعة ووجهات تعديل صريحة مع حفظ علاقات التسميات.
في هذه الصفحة
أهداف الدرس
- شرح حساب الأعمدة والأقنعة المنطقية ذات الأقواس.
- تعديل الإطار المقصود مباشرة وفق Copy-on-Write.
لا تستبدل الصياغة المتجهة قواعد العمل
يمكن لتعبير عمود ضرب units في unit_price_cents لكل صف، دون حلقة Python على كائنات الصفوف. يجعل ذلك النية مختصرة، لكن الوحدات والنوع والمحاذاة الصحيحة تظل مطلوبة. يختلف ضرب الدولارات في الكمية عن ضرب السنتات، وقد ينشر السعر المفقود عدم اليقين بدلاً من أن يصبح صفراً. استخدم وحدات نقدية صحيحة صغيرة عندما توافق العقد المعلن، مع اعتبار الفيض والتقريب. تصف المتجهة أسلوب الواجهة وغالباً تحسن الكفاءة؛ لكنها لا تضمن حلقة أصلية واحدة لكل عملية أو سرعة كل تعبير نصي قائم على كائنات.
تسمية الإطار الذي سيعدل
يحسب البرنامج التوضيحي إجمالي سطرين بعشرة وواحد وعشرين سنتاً، ويهيئ عمود حالة، ثم يغير صفوف units>=3 فقط بإسناد loc واحد على frame. في Copy-on-Write لأساس pandas 3.1، ليس تعديل Series مختارة وسيطة وسيلة لتحديث الأصل؛ لذلك لا يعتمد الإسناد المتسلسل. سم الهدف المقصود مباشرة، أو استخدم assign لبناء نتيجة جديدة. التأكيدات مشتقة من بيانات الصفين ولم تنفذ. ولا تعطي صيغة inplace وعداً عاماً بذاكرة أقل أو تنفيذ أسرع.
import pandas as pd
frame = pd.DataFrame({'units': [2, 3], 'unit_price_cents': [5, 7]})
frame['line_total_cents'] = frame['units'] * frame['unit_price_cents']
frame['status'] = 'normal'
frame.loc[frame['units'] >= 3, 'status'] = 'bulk'
assert frame['line_total_cents'].tolist() == [10, 21]
assert frame['status'].tolist() == ['normal', 'bulk']
print(frame['line_total_cents'].tolist())
[10, 21]
المتوقع [10,21] وتصبح حالة الثاني bulk فقط؛ ولم ينفذ برنامج pandas.
دمج الأقنعة بعواملها العنصرية
استخدم مقارنات محاطة بأقواس مع عوامل منطقية تعمل عنصراً بعنصر مثل & و| عند جمع شروط Series. تتطلب and/or في Python قيمة منطقية مفردة، وقد تثير خطأ غموض لسلسلة متعددة العناصر. تمنع الأقواس أيضاً تغير التعبير بسبب أسبقية العوامل. تحتاج قيم القناع المفقودة سياسة وفق النوع والواجهة؛ فالمجهول التجاري ليس كاذباً تلقائياً. افحص هويات المشمول والمستبعد معاً في البيانات. قد يعطي القناع عدد الصفوف المتوقع ويختار هويات خاطئة إذا لم تحاذ التسميات أو الشروط بصورة صحيحة.
فحص الإجماليات مستقلة عن المحرك
يحسب نموذج المكتبة القياسية إجمالي السطرين المتوقع من سجلات عادية ويجمعهما إلى واحد وثلاثين. يفحص قاعدة الحساب مستقلة عن عرض pandas وآلية إسنادها. لا يحاكي ترقية الأنواع أو محاذاة التسميات أو انتشار المفقود أو Copy-on-Write. تفيد هذه الاستقلالية في تشخيص اختلاف لاحق: قارن وحدات المصدر ووحدات السعر قبل الاشتباه في خطأ مكتبة. إذا دخلت صفوف مكررة قبل الضرب، فقد يصح كل سطر ويخطئ الإجمالي العام. لذلك يحتاج تحقق المجتمع وتحقق الصيغة دليلين منفصلين.
rows = [{'units': 2, 'unit_price_cents': 5}, {'units': 3, 'unit_price_cents': 7}]
totals = [row['units'] * row['unit_price_cents'] for row in rows]
assert totals == [10, 21]
assert sum(totals) == 31
print(totals, sum(totals))
[10, 21] 31
يفحص حساب السجلات الصيغة لا أنواع pandas أو تعديلها أو محاذاتها.
اختيار apply لتحويل مبرر فقط
قد تناسب apply الصفية منطقاً يحتاج سياق الصف فعلاً، لكنها ليست مكافئة تلقائياً لتعبير عمود في الأداء أو النوع. فضل عملية مدمجة واضحة عندما تعبر عن العقد، وافحص شكل ناتج الدالة المخصصة وحالات الفقد. تجنب تعديل كائن يمرر إلى تجميع أو apply إلا إذا دعمت الواجهة ذلك صراحة. ينفذ الدرس حساب السجلات العادية فقط. تبقى حسابات pandas وأقنعتها وإسنادها وأداؤها توضيحات غير منفذة، ولا يدعي المقرر قياس أداء أو تثبيت محرك اختياري.
الأخطاء الشائعة وإصلاحها
The truth value of a Series is ambiguous
- لماذا يحدث؟
- استخدام and/or المفردين لدمج شروط متعددة العناصر.
- كيف تصلحه؟
- استخدم عوامل أقنعة عنصرية بأقواس وسياسة مجهول صريحة.
- كيف تتجنب تكراره؟
- اختبر الحالات الموجبة والسالبة والمفقودة.
عدم تغيير إسناد متسلسل الإطار المقصود.
- لماذا يحدث؟
- تعديل كائن وسيط وفق Copy-on-Write.
- كيف تصلحه؟
- أسند مباشرة للكائن المقصود بمحدد صريح واحد.
- كيف تتجنب تكراره؟
- افحص نتيجتي الأصل والمشتق منفصلتين.
تضخم الإجمالي رغم صحة صيغة الصف.
- لماذا يحدث؟
- احتواء المجتمع صفوفاً مكررة أو غير مقصودة.
- كيف تصلحه؟
- صالح وحدة الصف والهوية قبل تفسير التجميع.
- كيف تتجنب تكراره؟
- تحقق من المجتمع والحساب قاعدتين منفصلتين.
اختبر فهمك
1. لماذا يفضل إسناد loc مباشر على تعديل frame["status"] باختيار ثان؟
اعرض الحل المشروح
يسمي الكائن وهدف الصف والعمود في إسناد واحد. في الأساس المختار يستقل الوسيط، ولا يحدث الأصل عبر إسناد متسلسل. تحقق من الإطار النهائي، ووضح فرق بناء جديد من تعديل الأصل.
2. هل يثبت استبدال حلقة Python بتعبير عمود قصير تحسن الأداء؟
اعرض الحل المشروح
لا؛ تهم العملية والنوع والخلفية والحجم والتخصيص. اختر التعبير الواضح لدلالته ثم قس حملاً ممثلاً إذا كان الأداء الادعاء. يفحص النموذج الحساب فقط ولا يقدم دليل قياس pandas.
أهم ما تعلمته
- وضح الوحدات ومنطق القناع وهدف التعديل.
- يحتاج التعبير المختصر تحقق المجتمع والمفقود أيضاً.