मैं NaN मूल्यों की जांच कैसे कर सकता हूं?


979

float('nan')नान में परिणाम (संख्या नहीं)। लेकिन मैं इसके लिए कैसे जांच करूं? बहुत आसान होना चाहिए, लेकिन मुझे यह नहीं मिल रहा है।


20
पायथन में NaN के कुछ इतिहास के लिए, PEP 754 देखें। python.org/dev/peps/pep-0754
क्रेग मैकक्वीन

जवाबों:


1275

math.isnan (एक्स)

वापसी Trueअगर एक्स एक NaN (नहीं एक नंबर), और है Falseअन्यथा।

>>> import math
>>> x = float('nan')
>>> math.isnan(x)
True

5
@ चार्ली-पार्कर: पायथन 3 में, math.isnan अभी भी गणित मॉड्यूल का एक हिस्सा है। docs.python.org/3/library/math.html#math.isnan । यदि आप चाहें तो numpy.isnan का उपयोग करें, यह उत्तर केवल एक सुझाव है।
गिमल g

2
@ SittingBull देखें docs.python.org/3/library/functions.html#float "यदि तर्क एक स्ट्रिंग है, तो इसमें दशमलव संख्या होनी चाहिए", या "Infinity" "inf" "nan"
gimble

35
है math.isnanकरने के लिए पसंद np.isnan()?
TMWP

34
@TMWP संभवतः ... import numpyलगभग 15 एमबी की रैम import mathलेता है , जबकि कुछ 0,2 एमबी लेता है
पेट्रुपैक

9
@TMWP: यदि आप NumPy का उपयोग कर रहे हैं, numpy.isnanतो एक बेहतर विकल्प है, क्योंकि यह NumPy सरणियों को संभालता है। आप NumPy उपयोग नहीं कर रहे हैं, तो ऐसा NumPy निर्भरता ले रहे हैं और समय सिर्फ एक NaN जांच करने के लिए NumPy लोड करने के लिए खर्च (लेकिन आप कोड है कि NaN चेकों करता है की तरह लिख रहे हैं, यह है कोई लाभ होने की संभावना तुम हो जाना चाहिए का उपयोग किया NumPy)।
user2357112

359

NaN के लिए परीक्षण करने का सामान्य तरीका यह देखना है कि क्या यह स्वयं के बराबर है:

def isNaN(num):
    return num != num

8
चेतावनी का शब्द: नीचे भालू की टिप्पणी को उद्धृत करते हुए "लोगों के लिए अजगर के साथ फंस गए <= 2.5। नान! = नान ने मज़बूती से काम नहीं किया। इसके बजाय प्रयोग किया गया।" ऐसा कहने के बाद, मैंने वास्तव में कभी भी इसे विफल नहीं देखा है।
मावन

22
मुझे यकीन है कि, ऑपरेटर ओवरलोडिंग को देखते हुए, इस फ़ंक्शन को भ्रमित करने के कई तरीके हैं। math.isnan ()
djsadinoff

4
यह ऊपर उल्लेखित 754 युक्ति में कहा गया है कि NaN == NaN को हमेशा गलत होना चाहिए, हालांकि इसे हमेशा इस तरह लागू नहीं किया जाता है। यह संभव नहीं है कि यह कैसे गणित और / या सुन्न है यह हुड के तहत वैसे भी जाँच करें?
हरि गणेश

धन्यवाद । यह भी 15-20x गुना तेजी से np.isnan का उपयोग करने की तुलना में अगर एक स्केलर पर ऑपरेशन कर रहा है
thomas.mac

5
भले ही यह काम करता है और एक हद तक समझ में आता है, मैं सिद्धांतों के साथ एक इंसान हूं और मैं इसे निषिद्ध जादू टोना घोषित करता हूं। कृपया इसके बजाय math.isnan का उपयोग करें।
गोंजालो

151

numpy.isnan(number)आपको बताता है कि यह है NaNया नहीं।


3
अजगर संस्करण 2.7 में भी काम करता है।
मिशेल किजर्स

6
numpy.all(numpy.isnan(data_list))यह भी उपयोगी है अगर आपको यह निर्धारित करने की आवश्यकता है कि सूची में सभी तत्व नैनो हैं
जे पी।

3
NumPy की कोई आवश्यकता नहीं:all(map(math.isnan, [float("nan")]*5))
sleblanc

6
जब यह उत्तर 6 साल पहले लिखा गया था, तो पायथन 2.5 अभी भी सामान्य उपयोग में था - और math.isnan मानक पुस्तकालय का हिस्सा नहीं था। अब दिनों मैं वास्तव में उम्मीद कर रहा हूँ कि कई जगहों पर ऐसा नहीं है!
शाम

4
ध्यान दें कि np.isnan () दशमलव को नहीं संभालता है। दशमलव प्रकार (कई संख्यात्मक कार्य के रूप में)। math.isnan () हैंडल करता है।
कोम्टे

55

यहां तीन तरीके हैं जहां आप एक चर का परीक्षण कर सकते हैं "NaN" या नहीं।

import pandas as pd
import numpy as np
import math

#For single variable all three libraries return single boolean
x1 = float("nan")

print(f"It's pd.isna  : {pd.isna(x1)}")
print(f"It's np.isnan  : {np.isnan(x1)}")
print(f"It's math.isnan : {math.isnan(x1)}")

उत्पादन

It's pd.isna  : True
It's np.isnan  : True
It's math.isnan  : True

2
pd.isna (मान) ने बहुत सारी परेशानियों को बचाया! एक आकर्षण की तरह काम कर!
अभिषेक

1
ps.isna()मेरे मुद्दों को हल करती है। धन्यवाद!
darthbhyrava

32

यहाँ एक जवाब के साथ काम कर रहा है:

  • एनईई 754 मानक का सम्मान करते हुए एनएन कार्यान्वयन
    • अर्थात्: अजगर के NaN: float('nan'), numpy.nan...
  • किसी भी अन्य वस्तुओं: स्ट्रिंग या जो भी (अपवाद का सामना नहीं करता है अगर सामना करना पड़ा)

मानक के बाद लागू किया गया एक NaN, एकमात्र मूल्य है जिसके लिए स्वयं के साथ असमानता की तुलना सही होनी चाहिए:

def is_nan(x):
    return (x != x)

और कुछ उदाहरण:

import numpy as np
values = [float('nan'), np.nan, 55, "string", lambda x : x]
for value in values:
    print(f"{repr(value):<8} : {is_nan(value)}")

आउटपुट:

nan      : True
nan      : True
55       : False
'string' : False
<function <lambda> at 0x000000000927BF28> : False

1
मैं जिस श्रृंखला की जाँच कर रहा हूँ, वह गायब मानों के साथ तार है 'नेन्स' (???) तो यह समाधान काम करता है जहाँ अन्य विफल रहे।
कीथजोलले

numpy.nanएक नियमित पायथन floatऑब्जेक्ट है, जिस तरह से लौटा है float('nan')। NumPy में आपके द्वारा सामना किए जाने वाले अधिकांश NaN numpy.nanवस्तु नहीं होंगे ।
user2357112

numpy.nanसी में अंतर्निहित लाइब्रेरी में अपने स्वयं के NaN मान को परिभाषित करता है । यह अजगर के NaN को लपेटता नहीं है। लेकिन अब, वे दोनों IEEE 754 मानक का पालन करते हैं क्योंकि वे C99 API पर निर्भर हैं।
x0s

@ user2357112supportsMonica: पायथन और सुन्न NaN वास्तव में एक ही तरह से व्यवहार नहीं करते हैं: float('nan') is float('nan')(गैर अद्वितीय) और np.nan is np.nan(अद्वितीय)
x0s

@ x0s: इसका NumPy से कोई लेना-देना नहीं है। np.nanएक विशिष्ट वस्तु है, जबकि प्रत्येक float('nan')कॉल एक नई वस्तु का उत्पादन करता है। अगर आपने किया nan = float('nan'), तो आपको nan is nanभी मिलेगा । यदि आपने वास्तविक NumPy NaN जैसा कुछ बनाया है np.float64('nan'), तो आपको np.float64('nan') is not np.float64('nan')भी मिलेगा
user2357112

28

मैं वास्तव में बस इस में भाग गया, लेकिन मेरे लिए यह नैनो, -inf या inf के लिए जाँच कर रहा था। मैंने अभी उपयोग किया है

if float('-inf') < float(num) < float('inf'):

यह संख्याओं के लिए सही है, नैन और दोनों के लिए गलत है, और स्ट्रिंग्स या अन्य प्रकार (जो शायद एक अच्छी बात है) जैसी चीजों के लिए एक अपवाद बढ़ाएगा। इसके अलावा यह गणित या सुन्न की तरह किसी भी पुस्तकालयों के आयात की आवश्यकता नहीं है (सुन्न इतना बड़ा है यह किसी भी बाध्यकारी अनुप्रयोग के आकार को दोगुना कर देता है)।


9
math.isfiniteपायथन 3.2 तक पेश नहीं किया गया था, इसलिए 2012 में @DaveTheScientist से जवाब दिया गया था कि यह बिल्कुल "पहिये को सुदृढ़ करना" नहीं था - समाधान अभी भी पायथन 2 के साथ काम करने वालों के लिए है
sudo_copy

22

math.isnan ()

या संख्या की खुद से तुलना करें। NaN हमेशा होता है! = NaN, अन्यथा (जैसे अगर यह है एक नंबर) तुलना सफल होने चाहिए।


6
अजगर के साथ फंसे लोगों के लिए <= 2.5। नान! = नान ने भरोसे से काम नहीं लिया। इसके बजाय सुन्न का इस्तेमाल किया।
भालू

16

एक अन्य विधि यदि आप <2.6 पर अटक गए हैं, तो आपके पास सुन्नता नहीं है, और आपके पास IEEE 754 समर्थन नहीं है:

def isNaN(x):
    return str(x) == str(1e400*0)

11

वैसे मैंने इस पोस्ट में प्रवेश किया है, क्योंकि मेरे पास फ़ंक्शन के साथ कुछ समस्याएँ हैं:

math.isnan()

जब आप यह कोड चलाते हैं तो समस्याएँ होती हैं:

a = "hello"
math.isnan(a)

यह अपवाद को जन्म देता है। इसके लिए मेरा समाधान एक और जाँच करना है:

def is_nan(x):
    return isinstance(x, float) and math.isnan(x)

3
यह संभवत: डाउनवोट किया गया था क्योंकि इस्नन () एक फ्लोट लेता है, न कि एक स्ट्रिंग। फ़ंक्शन में कुछ भी गलत नहीं है, और समस्याएं केवल इसके उपयोग के प्रयास में हैं। (उस विशेष उपयोग के मामले के लिए उसका समाधान मान्य है, लेकिन यह इस प्रश्न का उत्तर नहीं है।)
पीटर हैनसेन

6
इस तरह से जाँच के लिए सावधान रहें। यह numpy.float32 NaN's के लिए उदा काम नहीं करेगा। एक कोशिश / निर्माण को छोड़कर उपयोग करने के लिए बेहतर है: def is_nan(x): try: return math.isnan(x) except: return False
रोब

3
NaN का अर्थ यह नहीं है कि एक मान एक मान्य संख्या नहीं है। यह निर्दिष्ट करने के लिए IEEE फ़्लोटिंग पॉइंट प्रतिनिधित्व का हिस्सा है कि एक विशेष परिणाम अपरिभाषित है। उदा। 0 / 0. इसलिए पूछ रहा है कि क्या "हैलो" नान अर्थहीन है।
ब्राइस एम। डेम्पसे

2
यह बेहतर है क्योंकि NaN स्ट्रिंग्स, किट्स या फ्लोट्स की किसी भी सूची में उतर सकता है, इसलिए उपयोगी जाँच
RAFIQ

8

अजगर <2.6 के साथ मैं समाप्त हो गया

def isNaN(x):
    return str(float(x)).lower() == 'nan'

यह मेरे लिए एक सोलारिस 5.9 बॉक्स पर अजगर 2.5.1 और Ubuntu 10 पर अजगर 2.6.5 के साथ काम करता है


6
यह न भी पोर्टेबल, के रूप में विंडोज कभी कभी यह कहता है-1.#IND
माइक टी

5

मैं एक वेब-सेवा से डेटा प्राप्त कर रहा हूं जो NaNएक स्ट्रिंग के रूप में भेजता है 'Nan'। लेकिन मेरे डेटा में स्ट्रिंग के अन्य प्रकार भी हो सकते हैं, इसलिए एक साधारण float(value)एक अपवाद फेंक सकता है। मैंने स्वीकार किए गए उत्तर के निम्नलिखित प्रकार का उपयोग किया:

def isnan(value):
  try:
      import math
      return math.isnan(float(value))
  except:
      return False

आवश्यकता:

isnan('hello') == False
isnan('NaN') == True
isnan(100) == False
isnan(float('nan')) = True

1
याtry: int(value)
14

@chwi तो आपका सुझाव क्या valueहोने NaNया न होने के बारे में बताता है ?
महदी

खैर, "एक संख्या नहीं" होने के नाते, कुछ भी जो एक इंट को नहीं डाला जा सकता है मुझे लगता है कि वास्तव में एक संख्या नहीं है, और कोशिश बयान विफल हो जाएगा? कोशिश करो, सच लौटाओ, झूठे को छोड़कर।
chwi

@chwi ठीक है, "एक नंबर नहीं" का शाब्दिक अर्थ है, आप सही हैं, लेकिन यहां बात नहीं है। वास्तव में, मैं वास्तव में यह देख रहा हूं कि क्या शब्दार्थ क्या NaNहै (जैसे अजगर से जो आपको मिल सकता है float('inf') * 0), और इस प्रकार हालांकि स्ट्रिंग 'हैलो' एक संख्या नहीं है, लेकिन यह भी है NaNक्योंकि NaNअभी भी एक संख्यात्मक मूल्य नहीं है!
महदी

@chwi: आप सही हैं, यदि अपवाद हैंडलिंग विशिष्ट अपवाद के लिए है। लेकिन इस जवाब में, सामान्य अपवाद को नियंत्रित किया गया है। तो जांच करने की कोई आवश्यकता नहीं है int(value)सभी अपवाद के लिए, Falseलिखा जाएगा।
हर्षा बियानी

3

यह बताने के सभी तरीके कि क्या चर NaN है या नहीं:

कोई भी प्रकार नहीं

In [1]: from numpy import math

In [2]: a = None
In [3]: not a
Out[3]: True

In [4]: len(a or ()) == 0
Out[4]: True

In [5]: a == None
Out[5]: True

In [6]: a is None
Out[6]: True

In [7]: a != a
Out[7]: False

In [9]: math.isnan(a)
Traceback (most recent call last):
  File "<ipython-input-9-6d4d8c26d370>", line 1, in <module>
    math.isnan(a)
TypeError: a float is required

In [10]: len(a) == 0
Traceback (most recent call last):
  File "<ipython-input-10-65b72372873e>", line 1, in <module>
    len(a) == 0
TypeError: object of type 'NoneType' has no len()

NaN प्रकार

In [11]: b = float('nan')
In [12]: b
Out[12]: nan

In [13]: not b
Out[13]: False

In [14]: b != b
Out[14]: True

In [15]: math.isnan(b)
Out[15]: True

2

मिश्रित डेटा प्रकारों की सूची से NaN (फ्लोट) आइटम को कैसे निकालें

यदि आपके पास एक चलने योग्य में मिश्रित प्रकार हैं, तो यहां एक समाधान है जो कि खसखस ​​का उपयोग नहीं करता है:

from math import isnan

Z = ['a','b', float('NaN'), 'd', float('1.1024')]

[x for x in Z if not (
                      type(x) == float # let's drop all float values…
                      and isnan(x) # … but only if they are nan
                      )]
['ए', 'बी', 'डी', १.१०२४]

शॉर्ट-सर्किट मूल्यांकन का मतलब है कि isnanउन मूल्यों पर नहीं कहा जाएगा जो टाइप 'फ्लोट' के नहीं हैं, जैसा कि राइट-हैंड साइड का मूल्यांकन किए बिना False and (…)जल्दी Falseसे मूल्यांकन करता है।


1

पायथन में 3.6 एक स्ट्रिंग मान x math.isnan (x) और np.isnan (x) पर एक त्रुटि उठाता है। इसलिए मैं जांच नहीं कर सकता कि दिया गया मूल्य NaN है या नहीं अगर मुझे पहले से पता नहीं है कि यह एक नंबर है। निम्नलिखित इस समस्या को हल करने के लिए लगता है

if str(x)=='nan' and type(x)!='str':
    print ('NaN')
else:
    print ('non NaN')

0

प्रकार की नैनोट के लिए

>>> import pandas as pd
>>> value = float(nan)
>>> type(value)
>>> <class 'float'>
>>> pd.isnull(value)
True
>>>
>>> value = 'nan'
>>> type(value)
>>> <class 'str'>
>>> pd.isnull(value)
False

-5

पांडा में तार के लिए pd.isnull लें:

if not pd.isnull(atext):
  for word in nltk.word_tokenize(atext):

एनएलटीके के लिए सुविधा निष्कर्षण के रूप में कार्य

def act_features(atext):
features = {}
if not pd.isnull(atext):
  for word in nltk.word_tokenize(atext):
    if word not in default_stopwords:
      features['cont({})'.format(word.lower())]=True
return features

इस कमी के लिए क्या?
मैक्स क्लिनर

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