كيفية الإصلاح في 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
كيفية الإصلاح: تتداخل الأعمدة ولكن لم يتم تحديد أي لاحقة

Add a Comment

ایمئیل یایینلانمایاجاق ایسته‎نیله‎ن بوشلوقلار خاللانمیشدیر *