وبلاگ رسانگار
با ما حرفه ای باشید

سرور مجازی NVMe

چگونه NaN ها را در یک DataFrame پاندا پر کنیم

0 8
زمان لازم برای مطالعه: 3 دقیقه


مقادیر از دست رفته رایج هستند و یا به دلیل خطای انسانی، خطای ابزار، پردازش از یک تیم دیگر یا در غیر این صورت فقط کمبود داده برای یک مشاهده خاص رخ می دهند.

در این بایت، نگاهی به روش پر کردن NaNs در a خواهیم داشت DataFrame، اگر می خواهید NaN ها را با پر کردن آنها مدیریت کنید.

اول از همه، بیایید یک ماکت بسازیم 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 ها را در یک DataFrame پاندا پر کنیم

هنگامی که با تکنیک های مختلف پر می شود – این نمودار پر از NaN را می توان با:

چگونه NaN ها را در یک DataFrame پاندا پر کنیم

شما می توانید این مقادیر را در یک ستون جدید پر کنید و آن را به ستونی که می خواهید پر کنید اختصاص دهید یا در محل با استفاده از 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 استفاده خواهد شد. این به طور موثر با مقادیر ثابت پر می شود، جایی که مقدار ورودی بستگی دارد روی کل ستون

اول، پر کردن مقادیر میانه منجر به موارد زیر می شود:

چگونه NaN ها را در یک DataFrame پاندا پر کنیم

با مقادیر میانگین:

چگونه NaN ها را در یک DataFrame پاندا پر کنیم

با مقادیر حالت:

چگونه NaN ها را در یک DataFrame پاندا پر کنیم

fillna() – مقدار ثابت

همچنین می توانید به جای آن یک مقدار ثابت را پر کنید:

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

چگونه NaN ها را در یک DataFrame پاندا پر کنیم

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

چگونه NaN ها را در یک DataFrame پاندا پر کنیم

با پر کردن به عقب، برعکس اتفاق می افتد. ردیف 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 ها را در یک DataFrame پاندا پر کنیم

هر چند، اگر بیش از یک وجود داشته باشد NaN در یک توالی – اینها خوب عمل نمی کنند و می توانند NaN ها را به سمت پایین تر آبشار کنند، داده ها را منحرف کرده و مقادیر واقعی ثبت شده را حذف می کنند.

interpolate()

این 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 به احتمال زیاد a 1, 2, 3, 4, 5 توالی دور از ذهن نیست (اما تضمین شده نیست). در اینجا هم پر کردن دائمی و هم پر کردن رو به جلو یا عقب به طرز بدی شکست می خورند. به طور کلی – درون یابی معمولاً دوست خوبی برای پر کردن NaN ها در سیگنال های پر سر و صدا یا مجموعه داده های خراب است.

آزمایش با انواع درون یابی ممکن است نتایج بهتری به همراه داشته باشد.

در اینجا دو روش درون یابی (splice و polynomial نیاز به یک order بحث و جدل):

nearest = df('Col3').interpolate(method='nearest')
polynomial = df('Col3').interpolate(method='polynomial', order=3)

اینها منجر به:

چگونه NaN ها را در یک DataFrame پاندا پر کنیم

و:

چگونه NaN ها را در یک DataFrame پاندا پر کنیم

(برچسب‌ها به ترجمه)# python



منتشر شده در 1403-01-04 15:32:03

امتیاز شما به این مطلب
دیدگاه شما در خصوص مطلب چیست ؟

آدرس ایمیل شما منتشر نخواهد شد.

لطفا دیدگاه خود را با احترام به دیدگاه های دیگران و با توجه به محتوای مطلب درج کنید