गुम मान सामान्य हैं और या तो मानवीय त्रुटि, उपकरण त्रुटि, किसी अन्य टीम से प्रसंस्करण, या अन्यथा एक निश्चित अवलोकन के लिए डेटा की कमी के कारण होते हैं।
इस बाइट में, हम देखेंगे कि NaN को 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 सीखने के लिए व्यावहारिक मार्गदर्शिका देखें। Googling Git कमांड को रोकें और वास्तव में सीखना यह!
constant = df['Col3'].fillna(0, inplace=False
इसके परिणामस्वरूप प्रत्येक NaN के बजाय एक स्थिर मान (0) डाला जाता है। 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
फिलना () - फॉरवर्ड और बैकवर्ड फिल
प्रत्येक पंक्ति पर - आप पहले या बाद की पंक्ति से मान लेते हुए, आगे या पीछे भर सकते हैं:
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 को और नीचे कर सकते हैं, डेटा को तिरछा कर सकते हैं और वास्तव में रिकॉर्ड किए गए मानों को हटा सकते हैं।
प्रक्षेप ()
RSI 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
संभावना है a 1, 2, 3, 4, 5
अनुक्रम दूर की कौड़ी नहीं है (लेकिन इसकी गारंटी नहीं है)। लगातार फिलिंग और फॉरवर्ड या बैकवर्ड-फिलिंग दोनों ही यहां बुरी तरह विफल होते हैं। सामान्यतया - जब शोर संकेतों, या भ्रष्ट डेटासेट में NaN भरने की बात आती है तो इंटरपोलेशन आमतौर पर एक अच्छा दोस्त होने जा रहा है।
प्रक्षेप के प्रकारों के साथ प्रयोग करने से बेहतर परिणाम मिल सकते हैं।
यहाँ दो प्रक्षेप विधियाँ हैं (splice
और polynomial
की आवश्यकता है order
तर्क):
nearest = df['Col3'].interpolate(method='nearest')
polynomial = df['Col3'].interpolate(method='polynomial', order=3)
इनका परिणाम होता है:
और: