از طریق منوی جستجو مطلب مورد نظر خود در وبلاگ را به سرعت پیدا کنید
چگونه NaN ها را در یک DataFrame پاندا پر کنیم
سرفصلهای مطلب
مقادیر از دست رفته رایج هستند و یا به دلیل خطای انسانی، خطای ابزار، پردازش از یک تیم دیگر یا در غیر این صورت فقط کمبود داده برای یک مشاهده خاص رخ می دهند.
در این بایت، نگاهی به روش پر کردن 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 را می توان با:
شما می توانید این مقادیر را در یک ستون جدید پر کنید و آن را به ستونی که می خواهید پر کنید اختصاص دهید یا در محل با استفاده از 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() – مقدار ثابت
همچنین می توانید به جای آن یک مقدار ثابت را پر کنید:
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
در یک توالی – اینها خوب عمل نمی کنند و می توانند 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)
اینها منجر به:
و:
(برچسبها به ترجمه)# python
منتشر شده در 1403-01-04 15:32:03