NaN और कोई नहीं के बीच क्या अंतर है?


94

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

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

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

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

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


पाठ qwertyकोई संख्या नहीं है।
रॉबर्ट हार्वे

1
@RobertHarvey मुझे पता है, इसलिए निश्चित रूप Noneसे एक खाली सेल के मूल्य का बेहतर विवरण होगा।
user1083734

जवाबों:


107

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

वेस डॉक्स की पसंद 'एनए-प्रतिनिधित्व' में लिखते हैं :

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

नोट: "गोचा" जो कि पूर्णांक श्रृंखला में गुम डेटा है, फ्लोट्स के लिए बना हुआ है

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

#  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सदिश संचालन के लिए अनुमति देता है; इसकी एक फ्लोट वैल्यू, जबकि None, परिभाषा के अनुसार, ऑब्जेक्ट प्रकार को बाध्य करता है, जो मूल रूप से सभी दक्षता को सुन्न में अक्षम करता है।

इसलिए 3 बार तेजी से दोहराएं: ऑब्जेक्ट == खराब, फ्लोट == अच्छा

यह कहते हुए कि, कई ऑपरेशन अभी भी किसी भी बनाम NaN के साथ काम नहीं कर सकते (लेकिन शायद समर्थित नहीं हैं यानी वे कभी-कभी आश्चर्यजनक परिणाम दे सकते हैं ):

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

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

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


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

1
है <NA>भी एक np.nan?
शाम

18

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

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

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

दूसरी ओर, आप Noneऑपरेंड के रूप में गणितीय कार्य नहीं कर सकते ।

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

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


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

खैर, यह शायद एक डिजाइन विकल्प है। मैं DataFrames लगता है और सीरीज एक है dtypeकी, तो अमान्य मान dtype=floatसंख्यात्मक मान है, जिसके द्वारा प्रस्तुत होने चाहिए NaNऔर None(नहीं है Noneकी है NoneType)।
हेल्टनबाइकर

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

ठीक है धन्यवाद। इसलिए मैं वास्तव में अपने डेटाफ़्रेम में संख्याओं को नहीं पढ़ रहा हूं, लेकिन संख्याओं और अक्षरों के तार। खाली कोशिकाओं का पता लगाने के लिए मुझे किस तरह के चेक का उपयोग करना चाहिए? एक चेक की तरह; अगर dtype == फ्लोट: ??
user1083734

शायद आपके CSV डेटा का एक नमूना पोस्ट करने से मदद मिलेगी। मैं कल्पना कर सकता हूं कि अगर तार होते हैं, तो dtype पूरे स्तंभ (श्रृंखला) के लिए स्ट्रिंग होगा। लेकिन शायद अगर हर पंक्ति में समान संख्या में कॉलम नहीं हैं, तो आप अनुपलब्ध डेटा के साथ समाप्त होते हैं। मुझे लगता है कि आपको इसकी जाँच करनी होगी।
हेलटनबीकर

3

फ़ंक्शन isnan()यह देखने के लिए जांचता है कि क्या कुछ "नॉट ए नंबर" है और वापस आएगा या नहीं एक चर एक संख्या है, उदाहरण के लिए isnan(2)गलत वापस आ जाएगा

सशर्त myVar is not Noneलौटाता है कि क्या चर परिभाषित किया गया है या नहीं

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


1
मुझे लगता है isnan(2)कि वापसी होगी False, क्योंकि 2 एक NaN नहीं है।
हेल्टनबाइकर

इसके अलावा, numpy.emptyसरणी मान को इनिशियलाइज़ नहीं करता है NaN। यह केवल मूल्यों को प्रारंभिक नहीं करता है।
हेलटनबीकर

5
None-संसार की उचित जाँच है myVar is not None, नहीं myVar != None
जयम

3
ध्यान दें कि np.isnan()स्ट्रिंग चर के लिए लागू नहीं किया गया है, इसलिए यदि आप इसे एक स्ट्रिंग पास करते हैं तो यह दुर्घटनाग्रस्त हो जाएगा। उपयोग करने के लिए बेहतर है pd.isnullजो तार के साथ काम करता है।
माइकल

-1

नीचे अंतर हैं:

  • nan वर्ग का है float
  • None वर्ग का है NoneType

मुझे नीचे का लेख बहुत उपयोगी लगा: https://medium.com/analytics-vidhya/dealing-with-missing-values-nan-and-none-in-python-6fc9b8fbff31


हालांकि यह लिंक प्रश्न का उत्तर दे सकता है, लेकिन उत्तर के आवश्यक भागों को शामिल करना और संदर्भ के लिए लिंक प्रदान करना बेहतर है। लिंक-केवल उत्तर अमान्य हो सकते हैं यदि लिंक किए गए पृष्ठ बदल जाते हैं। - समीक्षा से
ए। कुतस्त्र

@ ए। कूटस्थ मुझे समझ में आता है
२००oot३wara में २oot

-3

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.