2013-07-08 12 views
50

मैं पांडा readcsv() का उपयोग कर एक सीएसवी फ़ाइल के दो कॉलम पढ़ रहा हूं और फिर मान को एक शब्दकोश में असाइन कर रहा हूं। कॉलम में संख्याओं और अक्षरों के तार होते हैं। कभी-कभी ऐसे मामले होते हैं जहां एक सेल खाली होता है। मेरी राय में, उस शब्दकोश प्रविष्टि को पढ़ने वाला मान None होना चाहिए, लेकिन इसके बजाय nan असाइन किया गया है। निश्चित रूप से None एक खाली सेल का अधिक वर्णनात्मक है क्योंकि इसमें शून्य मान है, जबकि nan बस कहता है कि मान पढ़ना एक संख्या नहीं है।नाएन और कोई नहीं के बीच क्या अंतर है?

क्या मेरी समझ सही है, None और nan के बीच क्या अंतर है? के बजाय nan क्यों असाइन किया गया है?

इसके अलावा, सभी रिक्त कक्षों के लिए मेरे शब्दकोश की जांच numpy.isnan() का उपयोग कर दिया गया है:

for k, v in my_dict.iteritems(): 
    if np.isnan(v): 

लेकिन यह मुझे कह रही है कि मैं v के लिए इस चेक का उपयोग नहीं कर सकते हैं एक त्रुटि देता है। मुझे लगता है कि ऐसा इसलिए है क्योंकि एक पूर्णांक या फ्लोट चर, एक स्ट्रिंग का उपयोग करने के लिए नहीं है। यदि यह सत्य है, तो मैं "खाली सेल"/nan मामले के लिए v कैसे देख सकता हूं?

+0

टेक्स्ट 'qwerty' एक संख्या नहीं है। –

+1

@ रॉबर्ट हार्वे मुझे पता है, इसलिए निश्चित रूप से 'कोई भी' खाली सेल के मूल्य का बेहतर विवरण नहीं होगा। – user1083734

+0

@ user1083734 मेरा उत्तर वर्णन करता है कि – Stephan

उत्तर

49

NaN missing data consistently in pandas के लिए प्लेसहोल्डर के रूप में उपयोग किया जाता है, स्थिरता अच्छी है। मैं आम तौर पर "गायब" के रूप में NaN को पढ़/अनुवाद करता हूं। दस्तावेज़ों में 'working with missing data' अनुभाग भी देखें।

वेस डॉक्स 'choice of NA-representation' में लिखते हैं:

उत्पादन उपयोग [nan] के वर्षों के बाद साबित हो गया है, कम से कम मेरी राय में, NumPy और अजगर में मामलों की स्थिति में दी गई सबसे अच्छा निर्णय होने के लिए सामान्य। विशेष मूल्य NaN (Not-A-Number) का उपयोग हर जगह एनए मान के रूप में किया जाता है, और एपीआई फ़ंक्शंस isnull और notnull हैं जिनका उपयोग NA मानों का पता लगाने के लिए dtypes में किया जा सकता है।
...
इस प्रकार, मैंने पाइथोनिक "व्यावहारिकता शुद्धता को धक्का दिया है" दृष्टिकोण और एनए को इंगित करने के लिए फ्लोट और ऑब्जेक्ट एरे में विशेष मूल्य का उपयोग करने के एक बहुत ही सरल दृष्टिकोण के लिए पूर्णांक एनए क्षमता का चयन किया है, और फ्लोटिंग के लिए पूर्णांक सरणी को बढ़ावा देना जब एनएएस पेश किया जाना चाहिए।

नोट: "gotcha" that integer Series containing missing data are upcast to floats

मेरी राय मुख्य कारण NaN उपयोग करने के लिए (कोई नहीं से अधिक) में है कि यह, numpy के float64 dtype साथ संग्रहीत किया जा सकता बल्कि कम कुशल वस्तु dtype से, NA type promotions देखते हैं।

# without forcing dtype it changes None to NaN! 
s_bad = pd.Series([1, None], dtype=object) 
s_good = pd.Series([1, np.nan]) 

In [13]: s_bad.dtype 
Out[13]: dtype('O') 

In [14]: s_good.dtype 
Out[14]: dtype('float64') 

जेफ टिप्पणियां (नीचे) इस पर:

np.nan vectorized के संचालन के लिए अनुमति देता है; यह एक फ्लोट वैल्यू है, जबकि None, परिभाषा के अनुसार, ऑब्जेक्ट प्रकार को मजबूर करता है, जो मूल रूप से numpy में सभी दक्षता अक्षम करता है।

तो दोहराने 3 बार तेज: वस्तु == बुरा, नाव == अच्छा

कह रही है कि, कई आपरेशनों अभी भी कोई नहीं बनाम NaN साथ बस के रूप में अच्छी तरह से काम कर सकते हैं (लेकिन शायद रहे हैं समर्थित नहीं यानी वे कभी कभी surprising results दे सकते हैं):

In [15]: s_bad.sum() 
Out[15]: 1 

In [16]: s_good.sum() 
Out[16]: 1.0 

दूसरे सवाल का जवाब करने के लिए:
आपको लापता डेटा (NaN) के परीक्षण के लिए pd.isnull और pd.notnull का उपयोग करना चाहिए।

+9

बस 2 सी जोड़ना .... '' np.nan' 'वेक्टरकृत परिचालनों की अनुमति देता है; यह एक फ्लोट वैल्यू है, जबकि परिभाषा ''ऑब्जेक्ट' प्रकार के द्वारा '' none''' नहीं है, और मूल रूप से numpy में सभी दक्षता को अक्षम करता है, इसलिए 3 बार तेज़ दोहराएं: 'object == bad, float == good'' – Jeff

+0

देखें भी: http://stackoverflow.com/a/19866269/1240268 –

-2

NaNके लिए stants नहीं।
Noneकिसी भी के लिए खड़ा हो सकता है।

2

समारोह अगर कुछ "न एक नंबर" है isnan() चेकों को देखने के लिए और वापस आ जाएगी या नहीं, एक चर एक संख्या है, उदाहरण के isnan(2) के लिए झूठी

सशर्त myVar is not None रिटर्न वापसी होगी या नहीं, चर रहा है परिभाषित

आपका numpy सरणी isnan() का उपयोग करता है, क्योंकि यह संख्या की एक सरणी होना करने का इरादा है और यह इन तत्वों माना जाता है "खाली" NaN करने वालों के सभी तत्वों को आरंभीकृत

+1

मुझे लगता है कि 'इस्नान (2)' 'गलत 'वापस आ जाएगा, क्योंकि 2 नाएन नहीं है। – heltonbiker

+0

इसके अलावा, 'numpy.empty' सरणी मानों को' NaN' में प्रारंभ नहीं करता है। यह बस मूल्यों को प्रारंभ नहीं करता है। – heltonbiker

+0

@heltonbiker idk जो मैं सोच रहा था – Stephan

7

NaN गणितीय परिचालनों पर संख्यात्मक मान के रूप में उपयोग किया जा सकता है, जबकि None (या कम से कम नहीं होना चाहिए)।

NaN एक संख्यात्मक मान है, जैसा कि IEEE 754 floating-point standard में परिभाषित किया गया है। None एक आंतरिक पायथन टिप (NoneType) है और इस संदर्भ में "संख्यात्मक रूप से अमान्य" की तुलना में "अनौपचारिक" या "खाली" जैसा होगा।

मुख्य "लक्षण" इस बात का है कि, यदि आप करते हैं, कहते हैं, एक औसत या किसी सरणी NaN, एक भी एक से युक्त पर राशि, आप NaN एक परिणाम के रूप मिलता है ...

में है दूसरी तरफ, आप ऑपरेटिंग के रूप में None का उपयोग करके गणितीय परिचालन नहीं कर सकते हैं।

तो, मामले के आधार पर, आप None का उपयोग अपने एल्गोरिदम को बता सकते हैं कि गणनाओं पर अमान्य या अचूक मूल्यों पर विचार न करें। इसका मतलब यह होगा कि एल्गोरिदम को यह देखने के लिए प्रत्येक मान का परीक्षण करना चाहिए कि यह None है या नहीं।

उदाहरण के लिए nansum और nan_to_num जैसे परिणामों को दूषित करने के लिए NaN मानों से बचने के लिए Numpy के कुछ फ़ंक्शन हैं।

+0

मैं आपसे सहमत हूं कि गैर-मौजूद प्रविष्टियों के लिए किसी का भी उपयोग नहीं किया जाना चाहिए, तो 'df = pd.readcsv ('file.csv')' खाली कोशिकाओं के लिए मुझे 'NaN' मान क्यों देता है, न कि' कोई नहीं '? जहां तक ​​मुझे पता है, pd.DataFrames संख्याओं के लिए विशिष्ट नहीं हैं। – user1083734

+0

अच्छा, यह शायद एक डिजाइन विकल्प है। मुझे लगता है कि डेटाफ्रेम और सीरीज़ में 'dtype' है, इसलिए 'dtype = float' के अमान्य मानों को संख्यात्मक मानों द्वारा दर्शाया जाना चाहिए, जो' NaN' है और 'कोई नहीं' नहीं है (' कोई नहीं ''noneType'' है। – heltonbiker

+0

इसके अलावा, बहुत से पांडो विधियों में 'na' तर्क होता है, जो आपको यह निर्धारित करने देता है कि आप उपलब्ध मूल्यों को प्रतिस्थापित करने के लिए किस मूल्य का उपयोग करने जा रहे हैं – heltonbiker

संबंधित मुद्दे