@ charlie-parker: En Python3, math.isnan fait toujours partie du module mathématique. docs.python.org/3/library/math.html#math.isnan . Utilisez numpy.isnan si vous le souhaitez, cette réponse n'est qu'une suggestion.
@TMWP peut-être ... import numpyprend environ 15 Mo de RAM, alors qu'il en import mathfaut environ 0,2 Mo
petrpulc
9
@TMWP: Si vous utilisez NumPy, numpy.isnanc'est un choix supérieur, car il gère les tableaux NumPy. Si vous n'utilisez pas NumPy, il n'y a aucun avantage à prendre une dépendance NumPy et à passer du temps à charger NumPy juste pour une vérification NaN (mais si vous écrivez le type de code qui fait des vérifications NaN, il est probable que vous devriez utiliser NumPy).
user2357112 prend en charge Monica
360
La façon habituelle de tester un NaN est de voir s'il est égal à lui-même:
Mot d'avertissement: citant le commentaire de Bear ci-dessous "Pour les personnes coincées avec python <= 2,5. Nan! = Nan ne fonctionnait pas de manière fiable. Utilisé numpy à la place." Cela dit, je ne l'ai jamais vu échouer.
mavnn
22
Je suis sûr que, compte tenu de la surcharge de l'opérateur, il existe de nombreuses façons de confondre cette fonction. rendez-vous avec math.isnan ()
djsadinoff
4
Il est dit dans la spécification 754 mentionnée ci-dessus que NaN == NaN doit toujours être faux, bien qu'il ne soit pas toujours implémenté en tant que tel. N'est-il pas possible que c'est ainsi que les mathématiques et / ou numpy vérifient cela sous le capot?
Hari Ganesan
Merci . c'est également 15 à 20 fois plus rapide que d'utiliser np.isnan si vous effectuez une opération sur un scalaire
thomas.mac
5
Même si cela fonctionne et, dans une certaine mesure, est logique, je suis un humain avec des principes et je déclare par la présente que la sorcellerie est interdite. Veuillez utiliser math.isnan à la place.
Gonzalo
152
numpy.isnan(number)vous dit si c'est le cas NaNou non.
numpy.all(numpy.isnan(data_list))est également utile si vous devez déterminer si tous les éléments de la liste sont nan
Jay P.
3
Pas besoin de NumPy:all(map(math.isnan, [float("nan")]*5))
sleblanc
6
Lorsque cette réponse a été écrite il y a 6 ans, Python 2.5 était encore couramment utilisé - et math.isnan ne faisait pas partie de la bibliothèque standard. De nos jours, j'espère vraiment que ce n'est pas le cas dans de nombreux endroits!
2015
4
notez que np.isnan () ne gère pas le type decimal.Decimal (autant de fonctions de numpy). math.isnan () gère.
comte
55
Voici trois façons de tester ou non une variable "NaN".
import pandas as pdimport numpy as npimport 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)}")
La série que je vérifie est que les chaînes avec des valeurs manquantes sont «nans» (???), donc cette solution fonctionne là où d'autres ont échoué.
keithpjolley
numpy.nanest un floatobjet Python standard , tout comme le type retourné par float('nan'). La plupart des NaN que vous rencontrez dans NumPy ne seront pas l' numpy.nanobjet.
user2357112 prend en charge Monica
numpy.nandéfinit sa valeur NaN sur sa propre dans la bibliothèque sous - jacente en C . Il n'emballe pas le NaN de python. Mais maintenant, ils sont tous deux conformes à la norme IEEE 754 car ils s'appuient sur l'API C99.
7h59
@ user2357112supportsMonica: Python et numpy NaN ne se comportent pas en fait de la même manière: float('nan') is float('nan')(non unique) et np.nan is np.nan(unique)
x0s
@ x0s: Cela n'a rien à voir avec NumPy. np.nanest un objet spécifique, tandis que chaque float('nan')appel produit un nouvel objet. Si vous le faisiez nan = float('nan'), vous en auriez nan is nanaussi. Si vous construisiez un véritable NumPy NaN avec quelque chose comme ça np.float64('nan'), vous en auriez np.float64('nan') is not np.float64('nan')aussi .
user2357112 prend en charge Monica
28
En fait, je suis juste tombé sur cela, mais pour moi, il vérifiait nan, -inf ou inf. Je viens d'utiliser
if float('-inf')< float(num)< float('inf'):
Cela est vrai pour les nombres, faux pour nan et les deux inf, et soulèvera une exception pour des choses comme les chaînes ou d'autres types (ce qui est probablement une bonne chose). De plus, cela ne nécessite pas d'importer de bibliothèques comme math ou numpy (numpy est tellement gros qu'il double la taille de toute application compilée).
math.isfiniten'a pas été introduit avant Python 3.2, donc étant donné la réponse de @DaveTheScientist publiée en 2012, ce n'était pas exactement "réinventer [la roue]" - la solution représente toujours ceux qui travaillent avec Python 2.
Il a probablement été rejeté car isnan () prend un flottant, pas une chaîne. Il n'y a rien de mal avec la fonction, et les problèmes ne résident que dans sa tentative d'utilisation. (Pour ce cas d'utilisation particulier, sa solution est valide, mais ce n'est pas une réponse à cette question.)
Peter Hansen
6
Soyez prudent lorsque vous vérifiez les types de cette manière. Cela ne fonctionnera pas, par exemple pour les NaP numpy.float32. Mieux vaut utiliser une construction try / except: def is_nan(x): try: return math.isnan(x) except: return False
Rob
3
NaN ne signifie pas qu'une valeur n'est pas un nombre valide. Cela fait partie de la représentation en virgule flottante IEEE pour spécifier qu'un résultat particulier n'est pas défini. par exemple 0/0. Par conséquent, demander si "bonjour" est nan n'a pas de sens.
Brice M. Dempsey
2
c'est mieux parce que NaN peut atterrir dans n'importe quelle liste de chaînes, entiers ou flottants, donc vérification utile
RAFIQ
J'ai dû implémenter exactement cela pour gérer les colonnes de chaînes dans les pandas.
Cristian Garcia
7
Avec python <2.6, je me suis retrouvé avec
def isNaN(x):return str(float(x)).lower()=='nan'
Cela fonctionne pour moi avec python 2.5.1 sur une boîte Solaris 5.9 et avec python 2.6.5 sur Ubuntu 10
Ce n'est pas trop portable, comme Windows l'appelle parfois-1.#IND
Mike T
5
Je reçois les données d'un service Web qui envoie NaNsous forme de chaîne 'Nan'. Mais il pourrait y avoir d'autres types de chaînes dans mes données, donc un simple float(value)pourrait lever une exception. J'ai utilisé la variante suivante de la réponse acceptée:
def isnan(value):try:import math
return math.isnan(float(value))except:returnFalse
@chwi alors que dit votre suggestion sur le fait d' valueêtre NaNou non?
Mahdi
Eh bien, étant "pas un nombre", tout ce qui ne peut pas être converti en un entier, je suppose, n'est en fait pas un nombre, et l'instruction try échouera? Essayez, retournez vrai, sauf retour faux.
chwi
@chwi Eh bien, en prenant "pas un nombre" littéralement, vous avez raison, mais ce n'est pas le point ici. En fait, je cherche exactement ce qu'est la sémantique NaN(comme en python ce que vous pourriez obtenir float('inf') * 0), et donc bien que la chaîne 'Hello' ne soit pas un nombre, mais ce n'est pas non plus NaNparce que NaNc'est toujours une valeur numérique!
Mahdi
@chwi: Vous avez raison, si la gestion des exceptions concerne une exception spécifique. Mais dans cette réponse, une exception générique a été gérée. Donc pas besoin de vérifier int(value)Pour toutes les exceptions, Falsesera écrit.
Harsha Biyani
3
Toutes les méthodes pour savoir si la variable est NaN ou None:
Aucun type
In[1]:from numpy import math
In[2]: a =NoneIn[3]:not a
Out[3]:TrueIn[4]: len(a or())==0Out[4]:TrueIn[5]: a ==NoneOut[5]:TrueIn[6]: a isNoneOut[6]:TrueIn[7]: a != a
Out[7]:FalseIn[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)==0Traceback(most recent call last):File"<ipython-input-10-65b72372873e>", line 1,in<module>
len(a)==0TypeError: object of type 'NoneType' has no len()
Type NaN
In[11]: b = float('nan')In[12]: b
Out[12]: nan
In[13]:not b
Out[13]:FalseIn[14]: b != b
Out[14]:TrueIn[15]: math.isnan(b)Out[15]:True
Comment supprimer des éléments NaN (float) d'une liste de types de données mixtes
Si vous avez des types mixtes dans un itérable, voici une solution qui n'utilise pas numpy:
from math import isnan
Z =['a','b', float('NaN'),'d', float('1.1024')][x for x in Z ifnot(
type(x)== float # let's drop all float values…and isnan(x)# … but only if they are nan)]
['a', 'b', 'd', 1.1024]
L'évaluation de court-circuit signifie que isnanles valeurs qui ne sont pas de type «flottant» ne seront pas appelées, car elles False and (…)sont évaluées rapidement Falsesans avoir à évaluer le côté droit.
En Python 3.6, la vérification d'une valeur de chaîne x math.isnan (x) et np.isnan (x) déclenche une erreur. Je ne peux donc pas vérifier si la valeur donnée est NaN ou non si je ne sais pas au préalable que c'est un nombre. Ce qui suit semble résoudre ce problème
if str(x)=='nan'and type(x)!='str':print('NaN')else:print('non NaN')
>>>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
ifnot pd.isnull(atext):for word in nltk.word_tokenize(atext):
la fonction d'extraction de fonctionnalités pour NLTK
def act_features(atext):
features ={}ifnot pd.isnull(atext):for word in nltk.word_tokenize(atext):if word notin default_stopwords:
features['cont({})'.format(word.lower())]=Truereturn features
Réponses:
math.isnan (x)
la source
math.isnan
préféré ànp.isnan()
?import numpy
prend environ 15 Mo de RAM, alors qu'il enimport math
faut environ 0,2 Monumpy.isnan
c'est un choix supérieur, car il gère les tableaux NumPy. Si vous n'utilisez pas NumPy, il n'y a aucun avantage à prendre une dépendance NumPy et à passer du temps à charger NumPy juste pour une vérification NaN (mais si vous écrivez le type de code qui fait des vérifications NaN, il est probable que vous devriez utiliser NumPy).La façon habituelle de tester un NaN est de voir s'il est égal à lui-même:
la source
numpy.isnan(number)
vous dit si c'est le casNaN
ou non.la source
numpy.all(numpy.isnan(data_list))
est également utile si vous devez déterminer si tous les éléments de la liste sont nanall(map(math.isnan, [float("nan")]*5))
Voici trois façons de tester ou non une variable "NaN".
Production
la source
ps.isna()
résout mes problèmes. Merci!voici une réponse avec:
float('nan')
,numpy.nan
...Un NaN implémenté suivant la norme, est la seule valeur pour laquelle la comparaison des inégalités avec lui-même doit retourner True:
Et quelques exemples:
Production:
la source
numpy.nan
est unfloat
objet Python standard , tout comme le type retourné parfloat('nan')
. La plupart des NaN que vous rencontrez dans NumPy ne seront pas l'numpy.nan
objet.numpy.nan
définit sa valeur NaN sur sa propre dans la bibliothèque sous - jacente en C . Il n'emballe pas le NaN de python. Mais maintenant, ils sont tous deux conformes à la norme IEEE 754 car ils s'appuient sur l'API C99.float('nan') is float('nan')
(non unique) etnp.nan is np.nan
(unique)np.nan
est un objet spécifique, tandis que chaquefloat('nan')
appel produit un nouvel objet. Si vous le faisieznan = float('nan')
, vous en aurieznan is nan
aussi. Si vous construisiez un véritable NumPy NaN avec quelque chose comme çanp.float64('nan')
, vous en aurieznp.float64('nan') is not np.float64('nan')
aussi .En fait, je suis juste tombé sur cela, mais pour moi, il vérifiait nan, -inf ou inf. Je viens d'utiliser
Cela est vrai pour les nombres, faux pour nan et les deux inf, et soulèvera une exception pour des choses comme les chaînes ou d'autres types (ce qui est probablement une bonne chose). De plus, cela ne nécessite pas d'importer de bibliothèques comme math ou numpy (numpy est tellement gros qu'il double la taille de toute application compilée).
la source
math.isfinite
n'a pas été introduit avant Python 3.2, donc étant donné la réponse de @DaveTheScientist publiée en 2012, ce n'était pas exactement "réinventer [la roue]" - la solution représente toujours ceux qui travaillent avec Python 2.math.isnan ()
ou comparer le nombre à lui-même. NaN est toujours! = NaN, sinon (par exemple s'il s'agit d' un nombre) la comparaison doit réussir.
la source
Une autre méthode si vous êtes bloqué sur <2.6, vous n'avez pas numpy et vous n'avez pas de support IEEE 754:
la source
Eh bien, je suis entré dans ce message, car j'ai eu quelques problèmes avec la fonction:
Il y a un problème lorsque vous exécutez ce code:
Cela soulève une exception. Ma solution est de faire une autre vérification:
la source
def is_nan(x): try: return math.isnan(x) except: return False
Avec python <2.6, je me suis retrouvé avec
Cela fonctionne pour moi avec python 2.5.1 sur une boîte Solaris 5.9 et avec python 2.6.5 sur Ubuntu 10
la source
-1.#IND
Je reçois les données d'un service Web qui envoie
NaN
sous forme de chaîne'Nan'
. Mais il pourrait y avoir d'autres types de chaînes dans mes données, donc un simplefloat(value)
pourrait lever une exception. J'ai utilisé la variante suivante de la réponse acceptée:Exigence:
la source
try: int(value)
value
êtreNaN
ou non?NaN
(comme en python ce que vous pourriez obtenirfloat('inf') * 0
), et donc bien que la chaîne 'Hello' ne soit pas un nombre, mais ce n'est pas non plusNaN
parce queNaN
c'est toujours une valeur numérique!int(value)
Pour toutes les exceptions,False
sera écrit.Toutes les méthodes pour savoir si la variable est NaN ou None:
Aucun type
Type NaN
la source
Comment supprimer des éléments NaN (float) d'une liste de types de données mixtes
Si vous avez des types mixtes dans un itérable, voici une solution qui n'utilise pas numpy:
L'évaluation de court-circuit signifie que
isnan
les valeurs qui ne sont pas de type «flottant» ne seront pas appelées, car ellesFalse and (…)
sont évaluées rapidementFalse
sans avoir à évaluer le côté droit.la source
En Python 3.6, la vérification d'une valeur de chaîne x math.isnan (x) et np.isnan (x) déclenche une erreur. Je ne peux donc pas vérifier si la valeur donnée est NaN ou non si je ne sais pas au préalable que c'est un nombre. Ce qui suit semble résoudre ce problème
la source
Il semble que vérifier s'il est égal à lui-même
est le plus rapide.
la source
la source
pour les chaînes en panda, prenez pd.isnull:
la fonction d'extraction de fonctionnalités pour NLTK
la source