在熊猫数据框中用 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.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)
【讨论】:
如果您从 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的主要内容,如果未能解决你的问题,请参考以下文章