Замініть None на NaN у фреймі даних pandas


99

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

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

Я хочу замінити python None пандами 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'

Як мені це робити?

Відповіді:


146

Ви можете використовувати 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

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.
Алекс Повель

16

Ось ще один варіант:

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

3
Будьте обережні, запускаючи df.replace ([None], np.nan, inplace = True), це змінило всі об’єкти дати та часу з відсутніми даними на dtypes типу. Отже, тепер у вас можуть бути порушені запити, якщо ви не зміните їх на дату, яка може обкладатися податком залежно від розміру ваших даних.
Даблдаун

15

Наступний рядок замінюється Noneна NaN:

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

Просто перевірте, це працює для мене. Чи виникають у вас помилки або значення "None" не замінюються?
Макс Ізаді

Примітка: цей метод використовує np.nan, який має плаваючий тип d (наприклад:) float64, на відміну від типового типу d для pandas для нанового objectстовпця.
tehfink

6
Зверніть увагу: це замінює рядки текстом "None", але не явними значеннями None ( None, як у константі ).
Грегор Мюллеггер

4

Якщо ви використовуєте df.replace ([None], np.nan, inplace = True), це змінило всі об'єкти datetime із відсутніми даними на dtypes об'єкта. Отже, тепер у вас можуть бути непрацездатні запити, якщо ви не зміните їх на дату, яка може обкладатися податком залежно від розміру ваших даних.

Якщо ви хочете використовувати цей метод, ви можете спочатку визначити поля 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.