ערכים חסרים הם שכיחים ומתרחשים עקב טעות אנוש, טעות במכשיר, עיבוד מצוות אחר או סתם מחסור בנתונים לתצפית מסוימת.
ב-Byte זה, נסקור כיצד למלא NaNs ב-a
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, עם שיטות עבודה מומלצות, סטנדרטים מקובלים בתעשייה ודף רמאות כלול. תפסיק לגוגל פקודות 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()
השמיים interpolate()
השיטה מאצילה את האינטרפולציה של ערכים ל-SciPy's חבילת שיטות לאינטרפולציה של ערכים. הוא מקבל מגוון רחב של טיעונים, כולל, 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
הרצף אינו מופרך (אך אינו מובטח). גם מילוי מתמיד וגם מילוי קדימה או אחורה נכשלים כאן מאוד. באופן כללי - אינטרפולציה בדרך כלל תהיה חברה טובה כשזה מגיע למילוי NaNs באותות רועשים, או מערכי נתונים מושחתים.
ניסוי עם סוגי אינטרפולציה עשוי להניב תוצאות טובות יותר.
להלן שתי שיטות אינטרפולציה (splice
ו polynomial
דורשים order
טַעֲנָה):
nearest = df['Col3'].interpolate(method='nearest')
polynomial = df['Col3'].interpolate(method='polynomial', order=3)
אלה מביאים ל:
ו: