在pandas数据帧中用NaN替换None

Ada*_*NYC 67 replace nan dataframe pandas nonetype

我有桌子x:

        website
0   http://www.google.com/
1   http://www.yahoo.com
2   None
Run Code Online (Sandbox Code Playgroud)

我想用pandas NaN替换python None.我试过了:

x.replace(to_replace=None, value=np.nan)
Run Code Online (Sandbox Code Playgroud)

但我得到了:

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'
Run Code Online (Sandbox Code Playgroud)

我该怎么办呢?

Gui*_*not 102

您可以使用DataFrame.fillnaSeries.fillna替换Python对象None,而不是字符串'None'.

import pandas as pd
Run Code Online (Sandbox Code Playgroud)

对于数据帧:

df.fillna(value=pd.np.nan, inplace=True)
Run Code Online (Sandbox Code Playgroud)

对于列或系列:

df.mycol.fillna(value=pd.np.nan, inplace=True)
Run Code Online (Sandbox Code Playgroud)

  • 如果您从 SQL 数据库导入数据,则可以将其与以下答案结合使用。这会将 None(不是字符串)转换为 NaN。然后你可以`df['column'].replace(nan, "", inplace=True)` 如果你希望 None 是空字符串。 (3认同)
  • `pd.np.nan` 现在给出 `FutureWarning:pandas.np 模块已弃用,并将在未来版本中从 pandas 中删除。直接导入 numpy 即可`。 (2认同)

Nic*_*lai 14

这是另一种选择:

df.replace(to_replace=[None], value=np.nan, inplace=True)
Run Code Online (Sandbox Code Playgroud)

  • 请注意,当您运行df.replace([None],np.nan,inplace = True)时,这会将所有缺少数据的日期时间对象更改为对象dtype。因此,除非您将其更改回日期时间,否则现在您可能会遇到断掉的查询,这可能会增加数据量,这取决于数据的大小。 (2认同)

小智 11

以下行替换NoneNaN:

df['column'].replace('None', np.nan, inplace=True)
Run Code Online (Sandbox Code Playgroud)

  • 请注意:这会将字符串替换为文本“None”,而不是显式的 None 值([常量中的 None](https://docs.python.org/3/library/constants.html#None))。 (10认同)

igo*_*rkf 6

该解决方案很简单,因为可以轻松替换所有列中的值。
您可以使用dict

import pandas as pd
import numpy as np

df = pd.DataFrame([[None, None], [None, None]])
print(df)
      0     1
0  None  None
1  None  None

# replacing
df = df.replace({None: np.nan})
print(df)
    0   1
0 NaN NaN
1 NaN NaN
Run Code Online (Sandbox Code Playgroud)


Dou*_*own 5

如果您使用 df.replace([None], np.nan, inplace=True),这会将所有缺少数据的日期时间对象更改为对象 dtypes。因此,现在您可能已经破坏了查询,除非您将它们改回日期时间,这可能会根据您的数据大小而增加。

如果要使用此方法,可以先识别 df 中的对象 dtype 字段,然后替换 None:

obj_columns = list(df.select_dtypes(include=['object']).columns.values)
df[obj_columns] = df[obj_columns].replace([None], np.nan)
Run Code Online (Sandbox Code Playgroud)