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

Python 填充Float列的np.nan条目会给出ValueError:填充值必须在类别中,python,python-3.x,pandas,Python,Python 3.x,Pandas,在使用和的解决方案在我的所有类别列中填充空值后,我的许多浮点列中留下了许多空值。我以为一个简单的df.fillna(0.0,inplace=True)就可以了,但是,我得到了一个错误ValueError:fill值必须在categories中。我认为这个错误只适用于categorytype列 所以 我有很多float列和category列。我通过添加类别“unknown”填充类别列,然后用“unknown”填充空值。现在,一个简单的 df.fillna(0.0, inplace = Tr

在使用和的解决方案在我的所有
类别
列中填充空值后,我的许多浮点列中留下了许多空值。我以为一个简单的
df.fillna(0.0,inplace=True)
就可以了,但是,我得到了一个错误
ValueError:fill值必须在categories
中。我认为这个错误只适用于
category
type列

所以

我有很多float列和category列。我通过添加类别“unknown”填充类别列,然后用“unknown”填充空值。现在,一个简单的

    df.fillna(0.0, inplace = True)  
应该有用的。但事实并非如此

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

     df = pd.DataFrame({"A": ["a"], "B":[np.nan] })
     df['A'] = df['A'].astype('category')
     df.fillna(0.0, inplace = True)
请不要说我能做到:

     df['A'].fillna(0.0, inplace = True)
我有很多浮动列,我不能一个接一个地去。我必须将剩余列中的所有空值批量填充0.0。请放心,所有列都是float类型,但是,可能还有其他
category
列,但是它们没有任何空值


感谢所有解决方案。

您只需在仅包含浮点列的切片上应用fillna(),然后重新分配。否则,pandas会认为您可能希望在categories列中填充一个不存在的值0.0,即使它们没有任何内容要填充

对您的示例进行的此修改将起作用:

df = pd.DataFrame({"A": ["a"], "B":[np.nan] })
df['A'] = df['A'].astype('category')
#df.fillna("a", inplace = True)
df.loc[:,[c for c in df.columns if df[c].dtype=="float64"]] = df.loc[:,[c for c in df.columns if df[c].dtype=="float64"]].fillna(0.0)
df

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

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

df.fillna({col: 0.0 for col in df.columns[df.dtypes.eq(float)]})

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

df.loc[:, df.dtypes.ne('category')] = df.select_dtypes(exclude='category').fillna(0.0)

更新:

显然,已经有人提出了一个悬而未决的问题。请看:

df.loc[:, df.dtypes.ne('category')] = df.select_dtypes(exclude='category').fillna(0.0)