在pandas DataFrame中使用None而不是np.nan作为空值

J J*_*nes 14 python dataframe pandas

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

实际上我的数据框是从csv读入的,但这里有一个简单的DataFrame,它有混合数据类型来说明我的问题.

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

我做不到:

>>> df.fillna(None)
ValueError: must specify a fill method or value
Run Code Online (Sandbox Code Playgroud)

也不:

>>> df[df.isnull()] = None
TypeError: Cannot do inplace boolean setting on mixed-types with a non np.nan value
Run Code Online (Sandbox Code Playgroud)

也不:

>>> df.replace(np.nan, None)
TypeError: cannot replace [nan] with method pad on a DataFrame
Run Code Online (Sandbox Code Playgroud)

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

>>> df[df == ""] = None
Run Code Online (Sandbox Code Playgroud)

哪个有效.但是现在我有混合数据类型,这是不行的.

由于我的代码的各种原因,能够使用None作为我的空值将是有帮助的.有没有办法可以将空值设置为None?或者我只需要返回我的其他代码并确保我在所有地方都使用np.isnan或pd.isnull?

piR*_*red 27

pd.DataFrame.where条件满足时使用
使用df值,否则使用None

df.where(df.notnull(), None)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

  • 救生员。这是完美的,尤其是在尝试将 NaN 值插入 SQL 时!!!! (5认同)
  • 谢谢!在看到这个之前,我尝试了许多不同的变体。到目前为止,它运行良好(我的数据中不能包含numpy.nan,因为我正在将其中的一些复制到SQL Alchemy对象中,而SQL Alchemy在写入数据库时​​无法处理nan) (4认同)
  • 单列: `df['A'].where(df['A].notnull(), None)` (3认同)
  • 对于想知道为什么它不起作用的人,Using df.where(pd.notnull(df), None) 在 l.3 及更高版本中不再起作用。执行 `df = df.replace({float("NaN"): None})`。在此处检查答案:/sf/ask/991390641/#54403705 和@apinanyogaratnam 答案如下。 (3认同)
  • 注意此方法将所有列的 `dtype` 设置为 `object` (2认同)

Kin*_*tto 7

扩展接受的答案。当您还需要捕获NaN数字 dtype 列中的值时,您可能需要object首先将 dtype 更改为:

df.astype(object).where(df.notna(), None)
Run Code Online (Sandbox Code Playgroud)

根据@BENNY 的原始回复