1664 Stimmen

Wie kann ich auf NaN-Werte prüfen?

float('nan') steht für NaN (not a number). Aber wie kann ich das überprüfen?

31 Stimmen

Zur Geschichte von NaN in Python, siehe PEP 754. python.org/dev/peps/pep-0754

2130voto

gimel Punkte 78080

Utilisez math.isnan :

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

0 Stimmen

Beachten Sie, dass dies ebenso gut funktioniert mit float("nan") wie bei numpy.core.numeric.NaN und vergleicht die beiden mit is funktioniert nicht. Daher könnte dies die bevorzugte Lösung in (altem?) Code sein, der möglicherweise beide Definitionen enthält, wenn ich mich nicht irre?

0 Stimmen

Es gibt mehrere Sorten von NaN da draußen, so dass ich nicht weiß, was der Operator is in diesem Szenario tut?

2 Stimmen

Ich habe einen Fehler mit dem obigen Code. Liegt es an Python 3? Allerdings hat numpy.isnan(float('nan')) funktioniert. Warum sollte ich math anstelle von numpy verwenden?

608voto

Chris Jester-Young Punkte 212385

Der übliche Weg, um auf ein NaN zu testen, ist zu sehen, ob es gleich sich selbst ist:

def isNaN(num):
    return num != num

10 Stimmen

Ein Wort der Warnung: Ich zitiere Bear's Kommentar unten: "Für Leute, die mit Python <= 2.5. Nan != Nan hat nicht zuverlässig funktioniert. Benutzt stattdessen numpy." Abgesehen davon habe ich es noch nie scheitern sehen.

49 Stimmen

Ich bin sicher, dass es angesichts der Überladung von Operatoren viele Möglichkeiten gibt, diese Funktion zu verwechseln. math.isnan()

9 Stimmen

In der oben erwähnten Spezifikation 754 heißt es, dass NaN==NaN immer falsch sein sollte, obwohl es nicht immer so implementiert wird. Ist es nicht möglich, dass math und/oder numpy dies ohnehin unter der Haube überprüfen?

294voto

mavnn Punkte 8433

numpy.isnan(number) sagt Ihnen, ob es sich um NaN oder nicht.

1 Stimmen

Danke, ich bin bei 2.5 geblieben, das ist genau das, was ich brauchte

3 Stimmen

Funktioniert auch in Python Version 2.7.

14 Stimmen

numpy.all(numpy.isnan(data_list)) ist auch nützlich, wenn Sie feststellen müssen, ob alle Elemente in der Liste nan sind

248voto

M. Hamza Rajput Punkte 5219

Hier sind drei Möglichkeiten, wie Sie prüfen können, ob eine Variable "NaN" ist oder nicht.

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)}}")

Ausgabe

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

21 Stimmen

Pd.isna(value) hat uns eine Menge Ärger erspart und funktioniert wie ein Zauber!

4 Stimmen

pd.isnan() o pd.isna() ? Das ist die Frage :D

5 Stimmen

Version 3 dieser antwort war korrekt und gut formatiert. diese (jetzt 7) ist wieder falsch. zurückgerollt als "dont want your edit" während die bearbeitungen die antwort verbessert haben, wtf.

61voto

Grzegorz Punkte 813

Es scheint, dass die Überprüfung, ob es gleich sich selbst ist

x!=x

ist die schnellste.

import pandas as pd 
import numpy as np 
import math 

x = float('nan')

%timeit x!=x                                                                                                                                                                                                                        
44.8 ns ± 0.152 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)

%timeit math.isnan(x)                                                                                                                                                                                                               
94.2 ns ± 0.955 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)

%timeit pd.isna(x) 
281 ns ± 5.48 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

%timeit np.isnan(x)                                                                                                                                                                                                                 
1.38 µs ± 15.7 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

1 Stimmen

Es ist erwähnenswert, dass dies auch dann funktioniert, wenn es um Unendlichkeiten geht. Das heißt, wenn z = float('inf') , z != z wird als false ausgewertet.

1 Stimmen

In meinem Computer z=float('inf') そして z==z wahr geben. x=float('nan') そして x==x Falsch geben.

3 Stimmen

In den meisten (wenn nicht allen) Fällen sind diese Geschwindigkeitsunterschiede nur dann von Bedeutung, wenn sie mehrmals wiederholt werden. Dann werden Sie numpy oder eine andere Tensorbibliothek, wie auch immer.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X