كيفية الإصلاح في pandas:settingwithcopywarning
أحد التحذيرات التي قد تواجهها عند استخدام الباندا هو:
SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame.
يظهر هذا التحذير عندما تواجه الباندا شيئًا يسمى “تخصيص السلسلة” – وهو مزيج من التسلسل والمهمة في خطوة واحدة.
ومن المهم أن نلاحظ أن هذا مجرد تحذير وليس خطأ. سيستمر تشغيل التعليمات البرمجية الخاصة بك، ولكن النتائج قد لا تكون دائمًا كما توقعت.
أسهل طريقة لمنع هذا التحذير هي استخدام الكود التالي:
p.d. options . fashion . chained_assignment = None
يوضح المثال التالي كيفية الاستجابة لهذا التحذير عمليًا.
كيفية إعادة إنتاج التحذير
لنفترض أننا أنشأنا DataFrame الباندا التالية:
import pandas as pd #createDataFrame df = pd. DataFrame ({' A ': [25, 12, 15, 14, 19, 23, 25, 29], ' B ': [5, 7, 7, 9, 12, 9, 9, 4], ' C ': [11, 8, 10, 6, 6, 5, 9, 12]}) #view DataFrame df A B C 0 25 5 11 1 12 7 8 2 15 7 10 3 14 9 6 4 19 12 6 5 23 9 5 6 25 9 9 7 29 4 12
لنفترض الآن أننا أنشأنا DataFrame جديدًا يحتوي على العمود “A” فقط من DataFrame الأصلي وقسمنا كل قيمة في العمود “A” على 2:
#define new DataFrame
df2 = df[[' A ']]
#divide all values in column 'A' by 2
df2[' A '] = df[' A '] / 2
/srv/conda/envs/notebook/lib/python3.7/site-packages/ipykernel_launcher.py:2:
SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead
نتلقى رسالة SettingWithCopyWarning لأننا نقوم بتعيين قيم جديدة للعمود “A” على “شريحة” من DataFrame الأصلي.
ومع ذلك، إذا نظرنا إلى DataFrame الجديد الذي أنشأناه، فسنرى أن كل قيمة قد تم تقسيمها بنجاح على 2:
#view new DataFrame
df2
HAS
0 12.5
1 6.0
2 7.5
3 7.0
4 9.5
5 11.5
6 12.5
7 14.5
وعلى الرغم من أننا تلقينا رسالة تحذير، إلا أن الباندا ما زالت تفعل ما اعتقدنا أنها ستفعله.
كيفية تجنب التحذير
لتجنب هذا التحذير، يوصى باستخدام بناء الجملة .loc[row Indexer, col Indexer] كما يلي:
#define new DataFrame
df2 = df. loc [:,[' A ']]
#divide each value in column 'A' by 2
df2[' A '] = df[' A '] / 2
#view result
df2
HAS
0 12.5
1 6.0
2 7.5
3 7.0
4 9.5
5 11.5
6 12.5
7 14.5
يحتوي DataFrame الجديد على جميع القيم من العمود “A” في DataFrame الأصلي، مقسومًا على اثنين، ولا تظهر أي رسائل تحذيرية.
إذا أردنا منع عرض رسالة التحذير، فيمكننا استخدام الكود التالي:
#prevent SettingWithCopyWarning message from appearing p.d. options . fashion . chained_assignment = None
للحصول على شرح مفصل عن سبب تجنب تعيين السلسلة، راجع وثائق الباندا عبر الإنترنت .
مصادر إضافية
كيفية الإصلاح: لا توجد وحدة تسمى الباندا
كيفية الإصلاح: لا توجد وحدة باسم numpy
كيفية الإصلاح: تتداخل الأعمدة ولكن لم يتم تحديد أي لاحقة