Заменить None на NaN в кадре данных pandas


99

У меня есть таблица x:

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

Я хочу заменить python None на pandas NaN. Я старался:

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

Но я получил:

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'

Как мне это сделать?

Ответы:


145

Вы можете использовать DataFrame.fillnaили, Series.fillnaкоторый заменит объект Python None, а не строку 'None'.

import pandas as pd
import numpy as np

Для фрейма данных:

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

Для столбца или серии:

df.mycol.fillna(value=np.nan, inplace=True)

3
Если вы импортировали данные из базы данных SQL, вы можете объединить это с ответом ниже. Это преобразует None (который не является строкой) в NaN. Тогда вы можете, df['column'].replace(nan, "", inplace=True)если хотите, чтобы None было пустой строкой.
VISQL 04

1
Этот ответ не работает для меня; это не заменяет None. Ответ Макса работает.
Даниэль

Я нашел этот столбец-конкретное решение , чтобы быть наиболее эффективным: df['website'].replace(pd.np.nan, 0, inplace=True). Он также не требует включения Numpy, полагаясь на встроенную ссылку Pandas.
CodeMantle

2
pd.np.nanтеперь дает FutureWarning: The pandas.np module is deprecated and will be removed from pandas in a future version. Import numpy directly instead.
Alex Povel,

16

Вот еще вариант:

df.replace(to_replace=[None], value=np.nan, inplace=True)

3
Будьте осторожны, когда вы запускаете df.replace ([None], np.nan, inplace = True), это изменяет все объекты datetime с отсутствующими данными на объекты dtypes. Итак, теперь у вас могут быть неработающие запросы, если вы не измените их обратно на datetime, что может облагаться налогом в зависимости от размера ваших данных.
Doubledown

15

Следующая строка заменяется Noneна NaN:

df['column'].replace('None', np.nan, inplace=True)

Просто перепроверил, у меня это работает. Возникают ли ошибки или значения «Нет» не заменяются?
Макс Изади

NB: этот метод использует np.nan, который имеет dtype float (например:) float64, в отличие от dtype pandas по умолчанию objectдля столбца nan.
tehfink

6
Имейте в виду: это заменяет строки текстом «None», но не явными значениями None ( None, как в константе ).
Gregor Müllegger

4

Если вы используете df.replace ([None], np.nan, inplace = True), это изменит все объекты datetime с отсутствующими данными на объекты dtypes. Итак, теперь у вас могут быть неработающие запросы, если вы не измените их обратно на datetime, что может облагаться налогом в зависимости от размера ваших данных.

Если вы хотите использовать этот метод, вы можете сначала определить поля dtype объекта в вашем df, а затем заменить None:

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
Привет и добро пожаловать в stackoverflow, и спасибо за ответ. Хотя этот код может ответить на вопрос, можете ли вы добавить объяснение того, какая проблема была решена и как вы ее решили? Это поможет будущим читателям лучше понять ваш ответ и извлечь из него уроки.
Плутан,
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.