如何在pandas fillna中继续使用"None"值

And*_*ets 11 python pandas

我有以下字典:

fillna(value={'first_name':'Andrii', 'last_name':'Furmanets', 'created_at':None})

当我把那本字典传给fillna我时,我看到:

提高ValueError('必须指定填充方法或值')\nValueError:必须指定填充方法或值\n"

在我看来,它失败了None价值.

我使用pandas版本0.20.3.

Asa*_*k91 26

如果您想使用 python 的 None 规范化所有空值。

df.fillna(np.nan).replace([np.nan], [None])
Run Code Online (Sandbox Code Playgroud)

第一个fillna将用 Numpy 的 NaN 替换所有(无、NAT、np.nan 等),然后用 python 的无替换 Numpy 的 NaN。

  • `df.replace([np.nan], [None])` 这就足够了 (6认同)
  • 对我来说,这是将 None 应用于整个数据帧的最简单方法。 (2认同)
  • 为什么需要列表括号? (2认同)

piR*_*red 10

设置
考虑示例数据帧df

df = pd.DataFrame(dict(A=[1, None], B=[None, 2], C=[None, 'D']))

df

     A    B     C
0  1.0  NaN  None
1  NaN  2.0     D
Run Code Online (Sandbox Code Playgroud)

我可以确认错误

df.fillna(dict(A=1, B=None, C=4))
Run Code Online (Sandbox Code Playgroud)
ValueError: must specify a fill method or value
Run Code Online (Sandbox Code Playgroud)

发生这种情况是因为pandas循环遍历字典中的键并fillna为每个相关列执行a .如果你看一下pd.Series.fillna方法的签名

Series.fillna(value=None, method=None, axis=None, inplace=False, limit=None, downcast=None, **kwargs)
Run Code Online (Sandbox Code Playgroud)

你会看到默认值是None.所以我们可以复制这个错误

df.A.fillna(None)
Run Code Online (Sandbox Code Playgroud)

或者等价

df.A.fillna()
Run Code Online (Sandbox Code Playgroud)

我要补充一点,考虑到你试图用空值填充空值,我并不感到非常惊讶.


你需要的是一个解决方案

解决方案对要使用非空值填充的列
使用pd.DataFrame.fillna.然后使用pd.DataFrame.replace特定列来跟随它,以便将一个空值与另一个值交换.

df.fillna(dict(A=1, C=2)).replace(dict(B={np.nan: None}))

     A     B  C
0  1.0  None  2
1  1.0     2  D
Run Code Online (Sandbox Code Playgroud)


atw*_*lsh 3

您使用什么类型的数据结构?这适用于 pandas 系列:

import pandas as pd

d = pd.Series({'first_name': 'Andrii', 'last_name':'Furmanets', 'created_at':None})
d = d.fillna('DATE')
Run Code Online (Sandbox Code Playgroud)