在熊猫数据框中用 NaN 替换 None

Posted

技术标签:

【中文标题】在熊猫数据框中用 NaN 替换 None【英文标题】:Replace None with NaN in pandas dataframe 【发布时间】:2014-07-07 18:00:54 【问题描述】:

我有桌子x:

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

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

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'

我应该怎么做?

【问题讨论】:

【参考方案1】:

您可以使用 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)

【讨论】:

如果您从 SQL 数据库导入数据,您可以将其与下面的答案结合使用。这会将 None(不是字符串)转换为 NaN。然后你可以df['column'].replace(nan, "", inplace=True) 如果说你希望 None 是空字符串。 这个答案对我不起作用;它不会取代None。 Max 的回答很有效。 我发现这个特定于列的解决方案是最有效的:df['website'].replace(pd.np.nan, 0, inplace=True)。它也不需要包含 Numpy,依赖于 Pandas 的内置参考。 pd.np.nan 现在给出FutureWarning: The pandas.np module is deprecated and will be removed from pandas in a future version. Import numpy directly instead【参考方案2】:

这是另一个选择:

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

【讨论】:

运行 df.replace([None], np.nan, inplace=True) 时请注意,这会将所有缺少数据的日期时间对象更改为对象 dtype。因此,现在您可能已经破坏了查询,除非您将它们改回日期时间,这可能会根据您的数据大小而产生负担。 你知道为什么需要括号吗?离开他们是行不通的。但我没有从文档中得到。【参考方案3】:

以下行将None 替换为NaN

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

【讨论】:

刚刚仔细检查过,它确实对我有用。您是否收到任何错误或“无”值没有被替换? 注意:此方法使用 np.nan,它具有浮点数据类型(例如:float64),而不是 pandas 用于 nan 列的默认数据类型 object 注意:这会将字符串替换为文本“None”,而不是显式的 None 值 (None as in the constant)。【参考方案4】:

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

如果你想使用这个方法,你可以先在你的df中识别出object dtype字段,然后替换掉None:

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

【讨论】:

【参考方案5】:
DataFrame['Col_name'].replace("None", np.nan, inplace=True)

【讨论】:

您好,欢迎来到 ***,感谢您的回答。虽然这段代码可能会回答这个问题,但您是否可以考虑添加一些解释来说明您解决了什么问题,以及您是如何解决的?这将有助于未来的读者更好地理解您的答案并从中学习。 @Plutian 这实际上并没有回答问题。该问题询问无,这仅适用于字符串“无”。它还重复了以前的答案,因此没有完全增加任何价值。【参考方案6】:

这是一个老问题,但这里有一个多列的解决方案:

values = 'col_A': 0, 'col_B': 0, 'col_C': 0, 'col_D': 0
df.fillna(value=values, inplace=True)

有关更多选项,请查看文档:

https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.fillna.html

【讨论】:

以上是关于在熊猫数据框中用 NaN 替换 None的主要内容,如果未能解决你的问题,请参考以下文章

如何在熊猫中用空列表[]填充数据框Nan值?

如何在熊猫中合并两个数据框以替换 nan

如何在巨大的数据框中用零替换 NaN 值?

如何在熊猫中用 NaN 替换浮点值?

在熊猫数据框中替换特殊字符

如何在熊猫数据框中将单元格设置为 NaN