Substitua Nenhum por NaN no dataframe do pandas

101

Eu tenho mesa x:

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

Quero substituir python None por pandas NaN. Eu tentei:

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

Mas eu tenho:

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'

Como devo proceder?

AdamNYC
fonte

Respostas:

148

Você pode usar DataFrame.fillnaou Series.fillnaque substituirá o objeto Python None, não a string 'None'.

import pandas as pd
import numpy as np

Para dataframe:

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

Para coluna ou série:

df.mycol.fillna(value=np.nan, inplace=True)
Guillaume Jacquenot
fonte
3
Se você importou dados de um banco de dados SQL, pode combinar isso com a resposta abaixo. Isso converte None (que não é uma string) em NaN. Então você pode df['column'].replace(nan, "", inplace=True)dizer que deseja que Nenhum seja uma string vazia.
VISQL
1
Essa resposta não funciona para mim; não substitui None. A resposta de Max funciona.
Daniel
I encontrado esta solução específicos de coluna seja a mais eficaz: df['website'].replace(pd.np.nan, 0, inplace=True). Também não requer a inclusão do Numpy, contando com a referência embutida do Pandas.
CodeMantle
2
pd.np.nanagora dá FutureWarning: The pandas.np module is deprecated and will be removed from pandas in a future version. Import numpy directly instead.
Alex Povel
17

Aqui está outra opção:

df.replace(to_replace=[None], value=np.nan, inplace=True)
Nickolai
fonte
3
Tenha cuidado ao executar df.replace ([None], np.nan, inplace = True), pois isso alterou todos os objetos datetime com dados ausentes para dtypes de objeto. Portanto, agora você pode ter consultas interrompidas, a menos que altere-as de volta para o datetime, o que pode ser desgastante, dependendo do tamanho dos seus dados.
Doubledown
15

A seguinte linha substitui Nonepor NaN:

df['column'].replace('None', np.nan, inplace=True)
Max Izadi
fonte
Apenas verifiquei, ele funciona para mim. Você obtém algum erro ou os valores 'Nenhum' não são substituídos?
Max Izadi
NB: este método usa np.nan, que tem um dtipo float (por exemplo:) float64, em oposição ao dtipo padrão de pandas objectpara uma coluna nan.
tehfink de
6
Esteja ciente: Isso substitui strings com o texto "Nenhum", mas não os valores Nenhum explícitos ( Nenhum como na constante ).
Gregor Müllegger
4

Se você usar df.replace ([None], np.nan, inplace = True), isso alterará todos os objetos datetime com dados ausentes para objetos dtypes. Portanto, agora você pode ter consultas interrompidas, a menos que altere-as de volta para datetime, o que pode ser desgastante, dependendo do tamanho dos seus dados.

Se você quiser usar este método, você pode primeiro identificar os campos de tipo de objeto em seu df e, em seguida, substituir o Nenhum:

obj_columns = list(df.select_dtypes(include=['object']).columns.values)
df[obj_columns] = df[obj_columns].replace([None], np.nan)
Apostar
fonte
0
DataFrame['Col_name'].replace("None", np.nan, inplace=True)
Ashish Sharma
fonte
1
Olá, bem-vindo ao stackoverflow e obrigado por responder. Embora este código possa responder à pergunta, você pode adicionar alguma explicação para o problema que foi resolvido e como você o resolveu? Isso ajudará futuros leitores a entender melhor sua resposta e aprender com ela.
Plutian