مقادیر از دست رفته رایج هستند و یا به دلیل خطای انسانی، خطای ابزار، پردازش از یک تیم دیگر یا در غیر این صورت فقط کمبود داده برای یک مشاهده خاص رخ می دهند.
در این بایت، نگاهی به نحوه پر کردن 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 را می توان با:
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 را با بهترین روش ها، استانداردهای پذیرفته شده در صنعت و برگه تقلب شامل بررسی کنید. دستورات Google 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() – Forward و Backward Fill
در هر ردیف - می توانید یک پر کردن به جلو یا عقب انجام دهید و مقدار را از ردیف قبل یا بعد بگیرید:
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()
La 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)
اینها منجر به:
و: