Zastąp None na NaN w pandas dataframe

101

Mam stolik x:

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

Chcę zamienić Pythona None na pandy NaN. Próbowałem:

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

Ale dostałem:

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'

Jak mam się do tego zabrać?

AdamNYC
źródło

Odpowiedzi:

148

Możesz użyć DataFrame.fillnalub, Series.fillnaktóry zastąpi obiekt Pythona None, a nie ciąg 'None'.

import pandas as pd
import numpy as np

W przypadku ramki danych:

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

W przypadku kolumny lub serii:

df.mycol.fillna(value=np.nan, inplace=True)
Guillaume Jacquenot
źródło
3
Jeśli zaimportowałeś dane z bazy danych SQL, możesz to połączyć z odpowiedzią poniżej. To konwertuje None (który nie jest ciągiem znaków) na NaN. Wtedy możesz, df['column'].replace(nan, "", inplace=True)jeśli chcesz, aby None był pusty.
VISQL,
1
To odpowiedź nie działa dla mnie; nie zastępuje None. Odpowiedź Maxa działa.
Daniel,
Stwierdzono, że ta kolumna specyficzne rozwiązania są najskuteczniejszym: df['website'].replace(pd.np.nan, 0, inplace=True). Nie wymaga również włączenia Numpy, opierając się na wbudowanych odniesieniach Pandas.
CodeMantle
2
pd.np.nanteraz daje FutureWarning: The pandas.np module is deprecated and will be removed from pandas in a future version. Import numpy directly instead.
Alex Povel
17

Oto inna opcja:

df.replace(to_replace=[None], value=np.nan, inplace=True)
Nickolai
źródło
3
Uwaga, po uruchomieniu df.replace ([None], np.nan, inplace = True) zmieniło to wszystkie obiekty daty i godziny z brakującymi danymi na dtypes obiektów. Więc teraz możesz mieć błędne zapytania, chyba że zmienisz je z powrotem na datę i godzinę, co może być opodatkowane w zależności od rozmiaru twoich danych.
Doubledown
15

Poniższy wiersz zastępuje Nonesię NaN:

df['column'].replace('None', np.nan, inplace=True)
Max Izadi
źródło
Po prostu sprawdziłem to dwukrotnie, to działa dla mnie. Czy pojawiają się jakieś błędy lub wartości „Brak” nie są zastępowane?
Max Izadi
Uwaga: ta metoda wykorzystuje np.nanzmiennoprzecinkowy typ dtype (np.:) float64, W przeciwieństwie do domyślnego typu dtype pandy objectdla kolumny nan.
tehfink
6
Uwaga: zastępuje ciągi tekstem „None”, ale nie jawnymi wartościami None ( None jak w przypadku stałej ).
Gregor Müllegger
4

Jeśli używasz df.replace ([None], np.nan, inplace = True), zmieniło to wszystkie obiekty daty i godziny z brakującymi danymi na dtypes obiektów. Więc teraz możesz mieć błędne zapytania, chyba że zmienisz je z powrotem na datę i godzinę, co może podlegać opodatkowaniu w zależności od rozmiaru twoich danych.

Jeśli chcesz użyć tej metody, możesz najpierw zidentyfikować pola typu obiektu w pliku df, a następnie zamienić opcję Brak:

obj_columns = list(df.select_dtypes(include=['object']).columns.values)
df[obj_columns] = df[obj_columns].replace([None], np.nan)
Doubleedown
źródło
0
DataFrame['Col_name'].replace("None", np.nan, inplace=True)
Ashish Sharma
źródło
1
Cześć i witaj w stackoverflow i dziękuję za odpowiedź. Chociaż ten kod może odpowiedzieć na pytanie, czy możesz rozważyć dodanie wyjaśnienia, jaki problem został rozwiązany i jak go rozwiązałeś? Pomoże to przyszłym czytelnikom lepiej zrozumieć Twoją odpowiedź i uczyć się z niej.
Plutian