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?

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)

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)

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)

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)

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

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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.