Was ist NaN? Ein vollständiger Leitfaden für Programmierer und Datenanalysten bis 2025

On this page

Das mysteriöse NaN

Sie führen eine wichtige Berechnung durch oder laden einen neuen Datensatz. Sie erwarten eine saubere, numerische Ausgabe, erhalten aber stattdessen NaN . Ihre Diagramme werden fehlerhaft dargestellt, Ihr Machine-Learning-Modell funktioniert nicht und Ihre Analyse wird vollständig abgebrochen. Was ist dieser mysteriöse Wert und was bedeutet er?

Zunächst einmal klären wir ein Missverständnis auf. „Nan“ kann zwar eine liebevolle Bezeichnung für eine Großmutter, ein leckeres Brot oder auch eine Provinz in Thailand sein, doch in der Informatik hat es eine ganz bestimmte und wichtige Bedeutung. Dieser Leitfaden hilft Ihnen, NaN in seinem technischen Kontext zu verstehen.

Dieser Artikel erklärt NaN auf einfache Weise. Wir gehen auf die Grundlagen ein, zeigen typische Ursachen auf und erklären, wie man NaN korrekt testet – was kniffliger ist, als man denkt. Vor allem aber lernen Sie praktische und zuverlässige Strategien für den Umgang mit NaN in der Datenanalyse und Softwareentwicklung.

Definition von „Keine Zahl“

Im Kern ist NaN ein spezieller Wert innerhalb des numerischen Datentyps. Er steht für „Not a Number“ (Keine Zahl) und repräsentiert ein undefiniertes oder unmögliches Ergebnis einer Gleitkomma-Berechnung. Es handelt sich nicht um einen Fehler, der Ihr Programm abbricht; vielmehr ist es ein Wert, der stillschweigend durch Ihre Berechnungen wandert, was sowohl hilfreich als auch eine potenzielle Fehlerquelle sein kann.

Dieses Konzept stammt aus dem IEEE-754-Standard für Gleitkommaarithmetik. Dieser Standard war eine bedeutende Entwicklung in der Informatik und sollte eine konsistente und zuverlässige Methode für die Hardware zur Verarbeitung reeller Zahlen schaffen. Ein zentraler Bestandteil dieses Standards war die Einführung spezieller Werte für ungewöhnliche Situationen wie die Division durch Null (die Unendlich ergibt) oder ungültige Operationen, ohne dass das gesamte System abstürzt. NaN ist die Antwort des Standards auf eine Operation, die kein mathematisch sinnvolles numerisches Ergebnis liefert.

Um effektiv mit NaN arbeiten zu können, müssen Sie die beiden wichtigsten Regeln verstehen:

  1. Die verwirrendste Regel: NaN ist mit nichts gleichzusetzen, auch nicht mit sich selbst. Ein Vergleich wie NaN == NaN ist immer false . Das ist so beabsichtigt. Wenn NaN ein undefiniertes Ergebnis darstellt (z. B. das Ergebnis von 0/0 ) und ein anderes NaN ein anderes undefiniertes Ergebnis darstellt (z. sqrt(-1) , sind sie dann wirklich gleich? Der Standard sagt nein. Zwei undefinierte Werte sind nicht notwendigerweise gleich.

  2. Die Ausbreitungsregel: Jede arithmetische Operation mit NaN als Eingabe führt zu NaN . Beispielsweise ist 5 + NaN gleich NaN , 2 * NaN gleich NaN und max(10, NaN) gleich NaN . Dadurch wird sichergestellt, dass der Zustand „undefiniert“ in einer Kette von Berechnungen beibehalten wird und Sie am Ende darauf hinweisen, dass irgendwo ein Fehler aufgetreten ist.

Die 5 häufigsten Ursachen für NaN

Das Verständnis der Ursachen NaN ist der erste Schritt, um dieses Problem zu vermeiden und zu beheben. Hier sind die fünf häufigsten Szenarien aus der Praxis.

1. Ungültige mathematische Operationen

Dies ist die direkteste Ursache. NaN ist das angegebene Ergebnis für Gleitkommaoperationen, die mathematisch nicht bestimmbar sind.

  • Null durch Null teilen ( 0.0 / 0.0 ).
  • Die Berechnung der Quadratwurzel einer negativen Zahl (z. B. sqrt(-1.0) in Systemen, die komplexe Zahlen nicht standardmäßig unterstützen).
  • Der Logarithmus eines negativen oder Nullwertes (z. B. log(-10) ).
  • Operationen mit Unendlichkeit, die unmöglich zu bestimmen sind, wie zum Beispiel Infinity - Infinity oder Infinity / Infinity .

Diese Operationen liefern kein gültiges Ergebnis, daher gibt das System NaN zurück.

2. Fehler beim Parsen der Daten

Wenn man versucht, Daten in eine Zahl umzuwandeln, diese aber nicht numerisch dargestellt werden können, ist das Ergebnis oft NaN . Dies kommt bei der Arbeit mit realen Daten sehr häufig vor.

Wenn man beispielsweise versucht, eine nicht-numerische Zeichenkette in eine Zahl umzuwandeln, erhält man NaN .

In JavaScript:

 let result = parseInt ( "hello world" ); // result is NaN

In Python würde dieses Szenario typischerweise einen ValueError auslösen, aber Datenanalysebibliotheken gehen anders damit um.

3. Fehlende oder beschädigte Daten

Dies gehört zum Alltag von Datenanalysten und Data Scientists. Beim Einlesen von Daten aus Quellen wie CSV-Dateien, JSON-Objekten oder Datenbanken enthalten numerische Spalten häufig fehlende Einträge. Dabei kann es sich um leere Zellen handeln oder um Platzhaltertexte wie „N/A“, „fehlend "" oder einfach eine leere Zeichenkette.

Moderne Datenanalysebibliotheken wie Pandas in Python sind so konzipiert, dass sie dies problemlos handhaben. Wenn Pandas eine numerische Spalte lädt und auf einen Wert stößt, der nicht als Zahl interpretiert werden kann, wird dieser fehlende Eintrag automatisch als NaN dargestellt.

 # Imagine a CSV file with an empty value in the 'age' column
 # Name,Age
 # Alice,30
 # Bob,
 # Charlie,25

 import pandas as pd 
Import io

 csv_data = "Name,Alter \n Alice,30 \n Bob, \n Charlie,25"
 df = pd.read_csv ( io.StringIO ( csv_data ) )

 Das Alter von Bob wird als NaN dargestellt.
 print ( df )
 # Name Alter
 # 0 Alice 30.0
 # 1 Bob NaN
 # 2 Charlie 25.0

4. Operationen mit undefinierten Variablen

In manchen weniger strengen Programmiersprachen oder Szenarien kann es vorkommen, dass man eine Berechnung mit einer Variable durchführt, die zwar deklariert, aber nie mit einem numerischen Wert belegt wurde. Wenn diese nicht initialisierte Variable standardmäßig einen Wert wie beispielsweise undefined in JavaScript hat, kann ihre Verwendung in einer arithmetischen Operation zu NaN führen.

 let a ; // a is undefined
 let b = a + 5 ; // b is now NaN

5. Propagiertes NaN

Oftmals wurde das NaN in der Endausgabe nicht durch die letzte Operation verursacht. Es kann viel früher in einer langen Rechenkette entstanden sein. Aufgrund der Ausbreitungsregel ( 5 + NaN = NaN ) kann ein einzelner NaN Wert eine ganze Kette von Berechnungen „infizieren“, weshalb es entscheidend ist, die Ursache des Problems zu finden.

Zuverlässige Erkennung von NaN

Da my_variable == NaN immer `false` ist, müssen Sie sprachspezifische Funktionen verwenden, um auf NaN -Werte zu prüfen. Die Verwendung eines direkten Gleichheitsvergleichs ist ein häufiger Fehler bei Entwicklern, die mit diesem Konzept noch nicht vertraut sind.

In Python

Python ist die gemeinsame Sprache der Datenwissenschaft, und sein Ökosystem verfügt über leistungsstarke Werkzeuge für den Umgang NaN .

Für eine einzelne Gleitkommazahl verwenden Sie das math .

 import math
 
x = float ( 'nan' )
 print ( math.isnan ( x ) ) # Ausgabe: True

 y = 5,0
 print ( math.isnan ( y ) ) # Ausgabe: False

Für Daten, die in NumPy-Arrays gespeichert sind und die Grundlage numerischer Berechnungen in Python bilden, verwenden Sie numpy.isnan() . Diese Funktion arbeitet elementweise über das gesamte Array.

import numpy as np

 arr = np . array ([ 1.0 , np . nan , 3.0 ])
 print ( np . isnan ( arr )) # Output: [False True False]

Für Pandas Series und DataFrames ist die Standardmethode die Verwendung .isna() oder dessen Alias .isnull() . Diese Methoden sind für die Datenbereinigung unerlässlich.

import pandas as pd
import numpy as np
 
df = pd . DataFrame ({ 'A' : [ 1 , 2 , np . nan ], 'B' : [ 5 , np . nan , np . nan ]})
 print ( df . isna ())
 # AB
 # 0 Falsch Falsch 
# 1 Falsch Wahr
 # 2 Wahr Wahr

In JavaScript

JavaScript bietet hierfür zwei Funktionen, und es ist wichtig, den Unterschied zu verstehen.

isNaN() ist die ältere, globale Funktion. Sie hat eine wichtige Eigenart: Sie versucht zunächst, ihr Argument in eine Zahl umzuwandeln. Dies führt zu überraschenden Ergebnissen.

 isNaN ( 'hello' );      // true, because 'hello' coerces to NaN
 isNaN ( undefined );    // true, because undefined coerces to NaN
 isNaN ( 123 );          // false 
isNaN ( NaN );          // WAHR

Number.isNaN() ist die moderne, sicherere Methode, die in ES6 (ECMAScript 2015) eingeführt wurde. Sie führt keine Typkonvertierung durch. Sie gibt nur dann true zurück, wenn der Wert vom Typ Number ist und tatsächlich NaN ist. Ab 2025 ist dies die empfohlene Vorgehensweise.

 Number . isNaN ( 'hello' );      // false, because 'hello' is not a number
 Number . isNaN ( undefined );    // false 
Number.isNaN ( 123 ) ;          // FALSCH
 Number.isNaN ( NaN ) ;          // WAHR

Verwenden Sie stets Number.isNaN() , um unerwartetes Verhalten bei der Typkonvertierung zu vermeiden.

In Java

Java bietet eine unkomplizierte Methode für seine Gleitkomma-Wrapperklassen.

 public class NanCheck { 
    öffentlich statisch Leere main ( String [] args ) {
        doppelt d1 = 0,0 / 0,0 ; // Dies ist NaN 
        doppelt d2 = 5.0 ;

        System.out.println ( Double.isNaN ( d1 ) ) ; // Ausgabe: true 
        System.out.println ( Double.isNaN ( d2 ) ) ; // Ausgabe: false

        schweben F1 = Float.NaN ; 
        System.out.println ( Float.isNaN ( f1 ) ) ; // Ausgabe: true
    }
 }

In C++

C++ verwendet die <cmath> -Bibliothek für seine Überprüfung.

 #include <iostream>
 #include <cmath>
 #include <limits>

 int main () { 
    doppelt d1 = std :: numeric_limits <double> :: quiet_NaN ( );
    doppelt d2 = 5.0 ;

    Wenn ( std :: isnan ( d1 )) { 
        std :: cout << "d1 ist NaN" << std :: endl ; // Dies wird gedruckt
    }

    Wenn ( ! std :: isnan ( d2 )) { 
        std :: cout << "d2 ist nicht NaN" << std :: endl ; // Dies wird gedruckt
    }

    zurückkehren 0 ;
 }

Praktische NaN-Strategien

Sie haben in Ihren Daten NaN -Werte gefunden. Was nun? Ihre Strategie hängt ganz von Ihrem Kontext und Ihren Zielen ab.

Strategie 1: Entfernung

Am einfachsten lassen sich die Datenpunkte, NaN enthalten, entfernen. In Pandas geschieht dies mit der Methode dropna() .

Anwendungsfall: Diese Option eignet sich für sehr große Datensätze, bei denen die Anzahl der Zeilen oder Spalten mit NaN gering ist (z. B. weniger als 1–2 % der Daten). In solchen Fällen führt deren Entfernung wahrscheinlich nicht zu einer signifikanten Verzerrung der Analyse.

Anleitung (Pandas):

 import pandas as pd
 import numpy as np
 
df = pd . DataFrame ({ 'A' : [ 1 , 2 , np . nan , 4 ], 'B' : [ 5 , np . nan , 7 , 8 ]})

 # Alle Zeilen entfernen, die mindestens einen NaN-Wert enthalten 
df_dropped_rows = df.dropna ( )
 print ( df_dropped_rows )
 # AB
 # 0 1.0 5.0
 # 3 4.0 8.0

 # Alle Spalten entfernen, die mindestens einen NaN-Wert enthalten
 df_dropped_cols = df.dropna ( axis = ' columns ' )
 print ( df_dropped_cols )
 # Leerer DataFrame
 # Spalten: []
 # Index: [0, 1, 2, 3]

Vorsicht: Gehen Sie äußerst sorgfältig vor. Wenn die fehlenden Werte nicht zufällig auftreten, kann das Entfernen von Daten Ihre Ergebnisse stark verfälschen. Wenn beispielsweise NaN -Werte für „Einkommen“ nur für eine bestimmte demografische Gruppe auftreten, führt das Entfernen dieser Zeilen dazu, dass diese demografische Gruppe aus Ihrer Analyse ausgeschlossen wird.

Strategie 2: Imputation

Die Imputation ist der Prozess, bei dem NaN -Werte durch einen Ersatzwert ersetzt werden. Dies wird häufig bevorzugt, da dadurch die Größe des Datensatzes erhalten bleibt, was für viele Algorithmen des maschinellen Lernens und Zeitreihenanalysen von entscheidender Bedeutung ist.

Gängige Imputationstechniken:

  • Konstanter Wert: Ersetzen Sie NaN durch 0, -1 oder einen anderen Platzhalter. Dies ist zwar einfach, kann aber die statistischen Eigenschaften der Spalte verfälschen. Würde man beispielsweise fehlende Altersangaben durch 0 ersetzen, würde das Durchschnittsalter drastisch sinken.
    python # Replace all NaNs with 0 df_filled_zero = df.fillna(0) print(df_filled_zero)

  • Statistische Kennzahlen: Ersetzen Sie NaN durch den Mittelwert, den Median oder den Modus der Spalte. Der Mittelwert reagiert empfindlich auf Ausreißer, der Median ist hingegen robuster. Der Modus eignet sich für kategoriale Merkmale, die numerisch kodiert wurden.
    python # Replace with the mean of each column df_filled_mean = df.fillna(df.mean()) print(df_filled_mean)

  • Vorwärts-/Rückwärtsfüllung: Dies eignet sich ideal für geordnete Daten wie Zeitreihen. ffill (Vorwärtsfüllung) verteilt die letzte gültige Beobachtung nach vorne, während bfill (Rückwärtsfüllung) die nächste gültige Beobachtung verwendet, um eine Lücke zu füllen.
    python # Forward-fill df_ffilled = df.fillna(method='ffill') print(df_ffilled)

Strategie 3: Ignorieren

Manchmal ist es nicht nötig, die Daten selbst zu ändern. Es genügt, eine Berechnung durchzuführen, die unempfindlich gegenüber NaN Werten ist. Viele numerische Bibliotheken bieten NaN -sichere Versionen gängiger Funktionen an.

Anleitung (NumPy):
Die NumPy-Bibliothek bietet eine Reihe von Funktionen, die Ergebnisse berechnen und dabei NaN -Werte vollständig ignorieren. Dies ist äußerst nützlich für schnelle statistische Auswertungen.

 import numpy as np

 arr_with_nan = np . array ([ 1.0 , 2.0 , np . nan , 4.0 ])

 # Standard sum and mean are "infected" by NaN 
print ( np.sum ( arr_with_nan ) ) # Ausgabe : nan
 print ( np.mean ( arr_with_nan ) ) # Ausgabe : nan

 # NaN-sichere Versionen
 print ( np.nansum ( arr_with_nan )) # Ausgabe: 7.0 (1+2+4 ) 
print ( np.nanmean ( arr_with_nan )) # Ausgabe: 2.333... ((1+2+4)/ 3 )
 print ( np.nanmax ( arr_with_nan ) ) # Ausgabe: 4.0

Diese Strategie ermöglicht es Ihnen, aussagekräftige Aggregatwerte zu erhalten, ohne Ihren ursprünglichen Datensatz zu verändern.

NaN vs. NULL vs. undefiniert

Entwickler, insbesondere solche, die mit JavaScript, Python und SQL arbeiten, verwechseln NaN oft mit anderen „leeren“ oder „nicht vorhandenen“ Werten. Das Verständnis ihrer unterschiedlichen Bedeutungen ist entscheidend für das Schreiben fehlerfreien Codes.

Konzept Sprache(n) Bedeutung Beispiel
NaN JavaScript, Python, Java „Keine Zahl“ – Das Ergebnis einer ungültigen mathematischen Operation. Es handelt sich um einen numerischen Wert. 0 / 0
null JavaScript, Java, SQL „Absichtliches Fehlen eines Wertes.“ – Ein Entwickler weist einer Variablen explizit diesen Wert zu, um anzuzeigen, dass sie keinen Wert hat. let user = null;
None Python Das Python-Äquivalent zu null . Es ist ein eindeutiges Objekt vom Typ NoneType , das die Abwesenheit eines Wertes repräsentiert. user = None
undefined JavaScript "Kein Wert zugewiesen." - Eine Variable wurde deklariert, ihr wurde aber noch kein Wert zugewiesen. let name;

Kurz gesagt: NaN ist ein numerischer Wert, der bei einer fehlgeschlagenen Rechenaufgabe auftritt. null und None sind explizite Zuweisungen von „nichts“. undefined ist der Standardzustand einer Variablen, die auf einen Wert wartet.

Fazit: NaN meistern

NaN ist kein Fehler, vor dem man sich fürchten muss, sondern ein definierter Sonderwert mit spezifischen Regeln. Sein ungewöhnlichstes Verhalten – dass er nicht gleich sich selbst ist – erfordert die Verwendung spezieller Funktionen wie math.isnan() oder Number.isNaN() für eine zuverlässige Erkennung. Sobald er gefunden wurde, ist der Umgang damit eine strategische Entscheidung, die von Ihrem spezifischen Ziel abhängt: Sie können ihn entfernen, durch einen anderen Wert ersetzen oder einfach NaN -sichere Funktionen verwenden, um ihn bei Berechnungen zu ignorieren.

Das Verständnis und die Beherrschung NaN sind eine grundlegende Fähigkeit, die Anfänger in der Programmierung und Datenanalyse von erfahrenen Experten unterscheidet. Sie bilden die Basis für die Entwicklung robusten, ausfallsicheren und produktionsreifen Codes, der auch im Jahr 2025 und darüber hinaus problemlos mit den Unvollkommenheiten realer Daten umgehen kann.

Häufige NaN-Fragen

Frage 1: Wofür steht NaN?

A: NaN steht für „Not a Number“ (Keine Zahl). Es handelt sich um einen Wert in der Gleitkommaarithmetik, der verwendet wird, um Ergebnisse darzustellen, die undefiniert sind oder nicht als reelle Zahl dargestellt werden können.

F2: Warum gibt NaN == NaN false zurück?

A: Dieses Verhalten ist im IEEE-754-Standard festgelegt. NaN steht für einen undefinierten Wert. Da das Ergebnis einer undefinierten Operation (wie 0/0 ) nicht unbedingt mit dem Ergebnis einer anderen undefinierten Operation (wie Infinity - Infinity ) übereinstimmt, werden zwei NaN -Werte niemals als gleich betrachtet. Diese Konstruktion verhindert fehlerhafte logische Vergleiche. Verwenden Sie daher immer eine spezielle Funktion wie Number.isNaN() in JavaScript oder math.isnan() in Python, um NaN zu überprüfen.

Frage 3: Soll ich einfach alle NaN Werte in 0 umwandeln?

A: Das kommt darauf an, aber Vorsicht ist geboten. Auch wenn es eine einfache Lösung ist, NaN durch 0 zu ersetzen, kann dies die statistischen Ergebnisse, insbesondere den Mittelwert, erheblich verfälschen. Steht NaN für fehlende Verkaufsdaten, impliziert die Umwandlung in 0, dass keine Verkäufe stattgefunden haben, was falsch sein kann. Oft ist es besser, den Mittelwert oder Median der Spalte zu verwenden oder eine Methode anzuwenden, die NaN Werte explizit ignoriert.

Frage 4: Wie gehen SQL-Datenbanken mit NaN um?

A: Die meisten traditionellen SQL-Datenbanken (wie PostgreSQL, MySQL, SQL Server) kennen keinen NaN Datentyp, der sich wie in Programmiersprachen verhält. Fehlende oder unbekannte Daten werden in SQL durch NULL dargestellt. Jede arithmetische oder Vergleichsoperation mit NULL führt typischerweise zu NULL , was zwar konzeptionell der Ausbreitung von NaN ähnelt, sich aber in Implementierung und Datentyp unterscheidet.

Zurück zum Blog