在 pandas DataFrame 中,使用 None 代替 np.nan 来表示空值

54

我有一个混合数据类型的pandas DataFrame。我想用None替换所有空值(而不是默认的np.nan)。但出于某种原因,这似乎几乎是不可能的。

实际上,我的DataFrame是从csv中读取的,但这里提供了一个简单的混合数据类型DataFrame来说明我的问题。

df = pd.DataFrame(index=[0], columns=range(5))
df.iloc[0] = [1, 'two', np.nan, 3, 4] 

我做不到:

>>> df.fillna(None)
ValueError: must specify a fill method or value

不是:

>>> df[df.isnull()] = None
TypeError: Cannot do inplace boolean setting on mixed-types with a non np.nan value
nor
>>> df.replace(np.nan, None)
TypeError: cannot replace [nan] with method pad on a DataFrame

我曾经有一个只包含字符串值的DataFrame,所以我可以这样做:

>>> df[df == ""] = None

曾经这很有效。但是现在我混合了数据类型,就不行了。

出于代码的各种原因,使用None作为空值将非常有帮助。有没有办法可以将空值设置为None?还是我需要回到其他代码中,确保我在所有地方都使用np.isnan或pd.isnull?


df[df.isnull()] = None - 对我来说运行良好(pandas 0.18.1) - MaxU - stand with Ukraine
3个回答

99

8
谢谢!在看到这个之前,我试了很多不同的变体。到目前为止,它完美地运作了。(我的数据中不能有numpy.nan,因为我正在将其中一些内容复制到SQL Alchemy对象中,而当写入数据库时,SQL Alchemy无法处理nan) - happyskeptic
7
救星。这很完美,特别是在尝试将 NaN 值插入 SQL 时! - addicted
3
单列翻译:df['A'].where(df['A].notnull(), None),意为将 DataFrame 中 'A' 列的缺失值替换为 None。 - Jorick Spitzen
8
注意,这种方法会将所有列的数据类型设置为 object - Jason Strimpel
2
对于那些想知道为什么它不起作用的人,使用df.where(pd.notnull(df), None)在l.3及以后的版本中不再起作用。请使用df = df.replace({float("NaN"): None})。在这里检查答案:https://stackoverflow.com/questions/14162723/replacing-pandas-or-numpy-nan-with-a-none-to-use-with-mysqldb/54403705#54403705,以及下面@apinanyogaratnam的答案。 - undefined
显示剩余4条评论

7

在接受的答案基础上进行扩展。当您还需要捕获数值类型列中的NaN值时,您可能需要先将数据类型更改为object

df.astype(object).where(df.notna(), None)

根据@BENNY的原始回答,如下所述。

是否可能仅更改最初具有NaN的列的数据类型,同时保持其余部分不变? - Vinicius Silva
当然可以。您可以仅更改单个列的数据类型:df['foo'].astype('float') - KingOtto

4

我发现这种方法对于用None替换NaN值很有帮助:df.replace({pd.np.nan: None})


1
请注意,pd.np.nan已过时,但您也可以使用float("nan")代替导入numpy。 - alexia

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