HOWTO · Python

ValueError: Float NaN kann in Python nicht in Integer konvertiert werden

In diesem Tutorial lernen Sie, den ValueError zu beheben: Float NaN kann in Python nicht in Integer konvertiert werden.

Auf dieser Seite

Eine Umwandlung wie int(value) oder eine pandas-Umwandlung in einen Integer-Typ kann NaN nicht darstellen. NaN ist ein Gleitkommawert, der häufig fehlende Daten kennzeichnet. Die Meldung ValueError: cannot convert float NaN to integer beschreibt dieses Umwandlungsproblem; pandas kann stattdessen auch pandas.errors.IntCastingNaNError auslösen, mitunter ebenfalls mit einem Hinweis auf unendliche Werte. Entscheiden Sie anhand der Bedeutung der betroffenen Werte in Ihren Daten, ob Sie sie ersetzen oder entfernen möchten.

Mit pandas fillna() vor der Umwandlung in Integer NaN ersetzen

Verwenden Sie fillna(), wenn jede betroffene Zeile erhalten bleiben soll und Sie einen sinnvollen Ersatzwert haben. Einen fehlenden Preis durch 0 zu ersetzen, ist nur dann passend, wenn null für Ihre Anwendung ein gültiger Preis ist. Dieses eigenständige Beispiel vergleicht das Auffüllen eines Preises mit einem gewählten Wert, das Entfernen von Zeilen mit fehlendem Preis und die Umwandlung eines NumPy-Skalars nach dem Ersetzen von NaN. Das Beispiel wurde überprüft und gibt [540, 0, 220], [540, 220] und 0 aus.

Führen Sie dieses Beispiel aus:

import numpy as np
import pandas as pd

prices = pd.DataFrame({"item": ["A", "B", "C"], "price": [540.0, np.nan, 220.0]})
filled = prices.copy()
filled["price"] = filled["price"].fillna(0).astype(int)
remaining = prices.dropna(subset=["price"]).copy()
remaining["price"] = remaining["price"].astype(int)
scalar = int(np.nan_to_num(np.nan))
print(filled["price"].tolist())
print(remaining["price"].tolist())
print(scalar)

Die erste Liste enthält weiterhin alle Zeilen und verwendet den gewählten Ersatzwert. In der zweiten Liste fehlt die Zeile, deren Preis nicht angegeben war. Die Umwandlung des Skalars zeigt, dass numpy.nan_to_num() einen numerischen Skalar zurückgibt, der an int() übergeben werden kann.

Mit pandas dropna() Zeilen mit NaN vor der Integer-Umwandlung entfernen

Verwenden Sie dropna(), wenn Zeilen mit fehlenden Werten aus dem Ergebnis ausgeschlossen werden sollen. Standardmäßig entfernt dropna() Zeilen, die in irgendeiner Spalte fehlende Werte enthalten. Dadurch können auch ansonsten nützliche Daten verloren gehen. Mit subset=["price"] beschränken Sie das Entfernen, wie im Beispiel oben, auf die Spalte, die Sie umwandeln möchten. Wandeln Sie anschließend diese bereinigte Spalte mit astype(int) um. Prüfen Sie, wie viele Zeilen verbleiben, wenn der Erhalt der Datensätze für Ihre Analyse wichtig ist.

Mit numpy.nan_to_num() NaN vor der Integer-Umwandlung ersetzen

Bei NumPy-Daten ersetzt numpy.nan_to_num() NaN standardmäßig durch 0.0. Mit dem Argument nan können Sie bei Bedarf einen anderen Ersatzwert festlegen. Wandeln Sie den zurückgegebenen Skalar mit int(...) um oder wenden Sie die Funktion auf ein Array an, bevor Sie astype(int) verwenden. Rufen Sie .astype() nicht für den Skalar auf, den numpy.nan_to_num(numpy.nan) zurückgibt, denn dieser ist kein Array. Enthalten die Daten auch positive oder negative unendliche Werte, müssen Sie diese ausdrücklich behandeln: NaN zu ersetzen macht unendliche Werte allein noch nicht sicher für die Integer-Umwandlung. Prüfen Sie in pandas die betreffende Spalte auf fehlende und nicht endliche Werte, bevor Sie eine Bereinigungsregel wählen.