在pandas数据框中,将None替换为NaN

178

我有一个表格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'

我该怎么做呢?

7个回答

258
你可以使用 DataFrame.fillnaSeries.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)

5
如果你从一个SQL数据库中导入数据,则可以结合下面的答案。这将把None(不是字符串)转换为NaN。然后,如果你想要将None替换为空字符串,可以使用df['column'].replace(nan, "", inplace=True) - VISQL
1
这个答案对我不起作用,它不能替换“None”。Max的回答可行。 - Daniel
我发现这个针对列的解决方案最为有效: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

33

这里有另外一个选项:

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

3
当您运行df.replace([None], np.nan, inplace=True)时,请注意,这将使所有缺失数据的日期时间对象变为对象dtype。因此,现在您可能会遇到查询出错的情况,除非您将它们改回日期时间类型,这取决于您的数据的大小可能会很费力。 - Doubledown
你知道为什么需要括号吗?不加它们是行不通的。但我在文档中没有找到这个信息。 - Make42

26

以下代码将None替换为NaN:

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

刚刚双重检查过了,这对我有效。你有收到任何错误信息或是 'None' 值没有被替换吗? - Maz Izadi
1
注意:此方法使用np.nan,它具有浮点dtype(例如:float64),而不是pandas默认的nan列的object dtype。 - tehfink
19
请注意:此操作将字符串替换为文本“None”,但不会替换明确的“None”值(即常量中的None)。请保持意思不变,使语言更加通俗易懂。 - Gregor Müllegger

8

如果你使用df.replace([None], np.nan, inplace=True),这会将所有包含缺失数据的日期时间对象更改为对象数据类型。因此,除非你将它们重新改回日期时间类型,否则可能会破坏查询,而这取决于数据的大小。

如果你想使用这种方法,你可以首先识别DF中的对象数据类型字段,然后替换None:

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

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

1

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

1
你好,欢迎来到stackoverflow,并感谢您的回答。虽然这段代码可能回答了问题,但您是否可以考虑添加一些解释,说明您解决的问题是什么以及如何解决它?这将有助于未来的读者更好地理解您的答案并从中学习。 - Plutian
1
@Plutian 这实际上并没有回答问题。问题是关于None的,这只适用于字符串“None”。它还重复了先前的答案,因此并没有添加任何价值。 - DU_ds

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接