Ersetzen Sie None durch NaN im Pandas-Datenrahmen

95

Ich habe Tisch x:

        website
0   http://www.google.com/
1   http://www.yahoo.com
2   None

Ich möchte Python None durch Pandas NaN ersetzen. Ich habe es versucht:

x.replace(to_replace=None, value=np.nan)

Aber ich habe:

TypeError: 'regex' must be a string or a compiled regular expression or a list or dict of strings or regular expressions, you passed a 'bool'

Wie soll ich vorgehen?

AdamNYC
quelle

Antworten:

140

Sie können das Python-Objekt verwenden DataFrame.fillnaoder Series.fillnaersetzen None, nicht die Zeichenfolge 'None'.

import pandas as pd
import numpy as np

Für Datenrahmen:

df = df.fillna(value=np.nan)

Für Spalte oder Serie:

df.mycol.fillna(value=np.nan, inplace=True)
Guillaume Jacquenot
quelle
3
Wenn Sie Daten aus einer SQL-Datenbank importiert haben, können Sie dies mit der folgenden Antwort kombinieren. Dies konvertiert None (was kein String ist) in NaN. Dann können Sie df['column'].replace(nan, "", inplace=True)sagen, dass None eine leere Zeichenfolge sein soll.
VISQL
1
Diese Antwort funktioniert bei mir nicht. es ersetzt nicht None. Max 'Antwort funktioniert.
Daniel
Ich fand diese spaltenspezifische Lösung am effektivsten : df['website'].replace(pd.np.nan, 0, inplace=True). Es ist auch nicht erforderlich, dass Numpy enthalten ist, da Pandas 'eingebaute Referenz verwendet wird.
CodeMantle
2
pd.np.nanjetzt gibt FutureWarning: The pandas.np module is deprecated and will be removed from pandas in a future version. Import numpy directly instead.
Alex Povel
16

Hier ist eine weitere Option:

df.replace(to_replace=[None], value=np.nan, inplace=True)
Nickolai
quelle
3
Bitte beachten Sie, dass beim Ausführen von df.replace ([None], np.nan, inplace = True) alle datetime-Objekte mit fehlenden Daten in Objekt-dtypes geändert werden. Jetzt haben Sie möglicherweise fehlerhafte Abfragen, es sei denn, Sie ändern sie wieder auf datetime, was je nach Größe Ihrer Daten eine Belastung darstellen kann.
Doubledown
14

Die folgende Zeile wird ersetzt Nonedurch NaN:

df['column'].replace('None', np.nan, inplace=True)
Max Izadi
quelle
Ich habe es nur noch einmal überprüft, es funktioniert bei mir. Erhalten Sie Fehler oder werden die Werte "Keine" nicht ersetzt?
Max Izadi
NB: Diese Methode verwendet np.naneinen Float-D-Typ (z. B. :) float64im Gegensatz zum Standard-D-Typ von Pandas objectfür eine Nan-Säule.
Tehfink
4
Beachten Sie: Dies ersetzt Zeichenfolgen durch den Text "Keine", jedoch nicht durch die expliziten Werte "Keine" ( Keine wie in der Konstante ).
Gregor Müllegger
3

Wenn Sie df.replace ([None], np.nan, inplace = True) verwenden, wurden alle datetime-Objekte mit fehlenden Daten in Objekt-dtypes geändert. Jetzt haben Sie möglicherweise fehlerhafte Abfragen, es sei denn, Sie ändern sie wieder auf datetime, was je nach Größe Ihrer Daten eine Belastung darstellen kann.

Wenn Sie diese Methode verwenden möchten, können Sie zuerst die Felder des Objekttyps in Ihrer Datenbank identifizieren und dann das Feld Keine ersetzen:

obj_columns = list(df.select_dtypes(include=['object']).columns.values)
df[obj_columns] = df[obj_columns].replace([None], np.nan)
Verdoppelung
quelle
1
DataFrame['Col_name'].replace("None", np.nan, inplace=True)
Ashish Sharma
quelle
1
Hallo und willkommen bei stackoverflow, und danke für die Antwort. Während dieser Code möglicherweise die Frage beantwortet, können Sie eine Erklärung hinzufügen, was das Problem ist, das Sie gelöst haben, und wie Sie es gelöst haben? Dies wird zukünftigen Lesern helfen, Ihre Antwort besser zu verstehen und daraus zu lernen.
Plutian