القيم المفقودة شائعة وتحدث إما بسبب خطأ بشري أو خطأ في الجهاز أو معالجة من فريق آخر أو بخلاف ذلك بسبب نقص البيانات لملاحظة معينة.
في هذا البايت ، سنلقي نظرة على كيفية ملء NaNs في ملف
DataFrame
، إذا اخترت التعامل مع NaNs عن طريق ملئها.
أولاً ، لنقم بإنشاء محاكاة DataFrame
مع استبعاد بعض القيم العشوائية:
import numpy as np
array = np.random.randn(25, 3)
mask = np.random.choice([1, 0], array.shape, p=[.3, .7]).astype(bool)
array[mask] = np.nan
df = pd.DataFrame(array, columns=['Col1', 'Col2', 'Col3'])
Col1 Col2 Col3
0 -0.671603 -0.792415 0.783922
1 0.207720 NaN 0.996131
2 -0.892115 -1.282333 NaN
3 -0.315598 -2.371529 -1.959646
4 NaN NaN -0.584636
5 0.314736 -0.692732 -0.303951
6 0.355121 NaN NaN
7 NaN -1.900148 1.230828
8 -1.795468 0.490953 NaN
9 -0.678491 -0.087815 NaN
10 0.755714 0.550589 -0.702019
11 0.951908 -0.529933 0.344544
12 NaN 0.075340 -0.187669
13 NaN 0.314342 -0.936066
14 NaN 1.293355 0.098964
دعنا نرسم ، على سبيل المثال ، العمود الثالث:
plt.plot(df['Col3'])
عند ملؤها بتقنيات مختلفة - يمكن استبدال الرسم البياني المملوء بـ NaN بـ:
fillna () - يعني ، متوسط ، الوضع
يمكنك ملء هذه القيم في عمود جديد وتعيينها للعمود الذي ترغب في تعبئته ، أو في المكان باستخدام inplace
جدال. هنا ، سنقوم باستخراج القيم المعبأة في عمود جديد لسهولة الاستقصاء:
mean = df['Col3'].fillna(df['Col3'].mean(), inplace=False)
median = df['Col3'].fillna(df['Col3'].median(), inplace=False)
mode = df['Col3'].fillna(df['Col3'].mode(), inplace=False)
الوسيط والمتوسط وطريقة العمود هي -0.187669
, -0.110873
و 0.000000
وسيتم استخدام هذه القيم لكل NaN على التوالي. يتم ملء هذا بشكل فعال بالقيم الثابتة ، حيث تعتمد القيمة التي يتم إدخالها على طاقة العمود.
أولاً ، ينتج عن التعبئة بالقيم المتوسطة:
مع القيم المتوسطة:
بقيم الوضع:
fillna () - قيمة ثابتة
يمكنك أيضًا ملء قيمة ثابتة بدلاً من ذلك:
تحقق من دليلنا العملي العملي لتعلم Git ، مع أفضل الممارسات ، والمعايير المقبولة في الصناعة ، وورقة الغش المضمنة. توقف عن أوامر Googling Git وفي الواقع تعلم ذلك!
constant = df['Col3'].fillna(0, inplace=False
ينتج عن هذا وضع قيمة ثابتة (0) بدلاً من كل NaN. 0
قريبة من الوسيط والمتوسط وتساوي الوضع ، لذا فإن القيم المعبأة ستشبه هذه الطريقة إلى حد كبير لمجموعة البيانات الوهمية الخاصة بنا:
0 0.783922
1 0.996131
2 0.000000
3 -1.959646
4 -0.584636
5 -0.303951
6 0.000000
7 1.230828
8 0.000000
9 0.000000
10 -0.702019
11 0.344544
12 -0.187669
13 -0.936066
14 0.098964
fillna () - تعبئة للأمام وللخلف
في كل صف - يمكنك عمل تعبئة للأمام أو للخلف ، مع أخذ القيمة إما من الصف قبل أو بعد:
ffill = df['Col3'].fillna(method='ffill')
bfill = df['Col3'].fillna(method='bfill')
مع الملء الأمامي ، نظرًا لأننا مفقودون من الصف 2 - يتم أخذ القيمة من الصف 1 لملء الصف الثاني. تنتشر القيم إلى الأمام:
0 0.783922
1 0.996131
2 0.996131
3 -1.959646
4 -0.584636
5 -0.303951
6 -0.303951
7 1.230828
8 1.230828
9 1.230828
10 -0.702019
11 0.344544
12 -0.187669
13 -0.936066
14 0.098964
مع الملء الخلفي ، يحدث العكس. يتم تعبئة الصف 2 بالقيمة من الصف 3:
0 0.783922
1 0.996131
2 -1.959646
3 -1.959646
4 -0.584636
5 -0.303951
6 1.230828
7 1.230828
8 -0.702019
9 -0.702019
10 -0.702019
11 0.344544
12 -0.187669
13 -0.936066
14 0.098964
رغم ذلك ، إذا كان هناك أكثر من واحد NaN
في تسلسل - لن تعمل هذه الأشياء بشكل جيد ويمكن أن تؤدي إلى زيادة تتابع NaNs ، مما يؤدي إلى تحريف البيانات وإزالة القيم المسجلة بالفعل.
تحقق()
• interpolate()
تفوض الطريقة استيفاء القيم إلى SciPy مجموعة من الأساليب لاستيفاء القيم. يقبل مجموعة متنوعة من الحجج ، بما في ذلك ، nearest
, zero
, slinear
, quadratic
, cubic
, spline
, barycentric
, polynomial
, krogh
, piecewise_polynomial
, spline
, pchip
, akima
, cubicspline
، الخ.
الاستيفاء أكثر مرونة و "ذكاء" من مجرد ملء القيم بالثوابت أو المتغيرات النصفية مثل الطرق السابقة.
يمكن أن يملأ الاستيفاء بشكل صحيح تسلسل بطريقة لا تستطيع أي طرق أخرى القيام بها ، مثل:
s = pd.Series([0, 1, np.nan, np.nan, np.nan, 5])
s.fillna(s.mean()).values
s.fillna(method='ffill').values
s.interpolate().values
الاستيفاء الافتراضي هو خطي ، ويفترض ذلك 1...5
من المحتمل أن يكون 1, 2, 3, 4, 5
التسلسل ليس بعيد المنال (ولكن ليس مضمونًا). كل من الملء المستمر والتعبئة الأمامية أو الخلفية تفشل فشلاً ذريعاً هنا. بشكل عام - عادةً ما يكون الاستيفاء صديقًا جيدًا عندما يتعلق الأمر بملء NaN بإشارات صاخبة أو مجموعات بيانات فاسدة.
قد تؤدي تجربة أنواع الاستيفاء إلى نتائج أفضل.
فيما يلي طريقتان من أساليب الاستيفاء (splice
و polynomial
تتطلب أ order
جدال):
nearest = df['Col3'].interpolate(method='nearest')
polynomial = df['Col3'].interpolate(method='polynomial', order=3)
ينتج عن ذلك:
و: