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?

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)

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)

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)

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)

1
DataFrame['Col_name'].replace("None", np.nan, inplace=True)

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.