填充 Float Column 的 np.nan 条目会给出 ValueError:填充值必须在类别中

Sum*_*ana 5 python python-3.x pandas

category使用这里这里的解决方案我的所有列中填充空值后,我的许多浮点列中都留下了许多空值。我认为一个简单的方法df.fillna(0.0, inplace = True)会起作用,但是,我收到了错误ValueError: fill value must be in categories。我认为此错误仅适用于category类型列。

所以,

我有许多浮动列和许多类别列。我通过添加类别“未知”然后用“未知”填充空值来填充类别列。现在,一个简单的

    df.fillna(0.0, inplace = True)  
Run Code Online (Sandbox Code Playgroud)

应该有效。但是,事实并非如此。

重现此问题的简单方法如下:

     df = pd.DataFrame({"A": ["a"], "B":[np.nan] })
     df['A'] = df['A'].astype('category')
     df.fillna(0.0, inplace = True)
Run Code Online (Sandbox Code Playgroud)

请不要说我能做到:

     df['A'].fillna(0.0, inplace = True)
Run Code Online (Sandbox Code Playgroud)

我有很多浮动列,我不能一一去。我必须批量填充剩余列中的所有空值 0.0。请放心,所有列都是浮点类型,但是,可能还有额外的category列,但是,它们没有任何空值。

欣赏任何解决方案。

Cai*_*lva 2

这里的主要问题是 pandas 不允许我们用不在类别级别中的NaN值替换 a 中的值。category例如,如果您尝试df.fillna('a')它就会起作用,因为“a”存在于类别级别中。有趣的是,即使列NaN中没有category,pandas 也会引发 a ValueError(也许是一个错误?)。因此,您必须指定目标列或目标dtype列才能填充NaN

也就是说,您可以轻松地NaN在尽可能多的浮动列中替换:

df.fillna({col: 0.0 for col in df.columns[df.dtypes.eq(float)]})
Run Code Online (Sandbox Code Playgroud)

或者

df.loc[:, df.dtypes.eq(float)] = df.select_dtypes(float).fillna(0.0)
Run Code Online (Sandbox Code Playgroud)

或者,您可以只填写NaN除类别之外的所有列:

df.loc[:, df.dtypes.ne('category')] = df.select_dtypes(exclude='category').fillna(0.0)
Run Code Online (Sandbox Code Playgroud)

更新:

显然,已经提出了一个悬而未决的问题。看一下: https: //github.com/pandas-dev/pandas/issues/24079