熊猫-填充分类数据中的nan



我正在尝试使用以下代码填充缺失值(NAN)

NAN_SUBSTITUTION_VALUE = 1
g = g.fillna(NAN_SUBSTITUTION_VALUE)

但是我得到以下错误

ValueError: fill value must be in categories.

有人能解释一下这个错误吗

你的问题错过了g是什么重要的一点,特别是它有dtype categorical。我假设它是这样的:

g = pd.Series(["A", "B", "C", np.nan], dtype="category")

您遇到的问题是fillna需要一个已经存在的值作为一个类别。例如,g.fillna("A")可以工作,但g.fillna("D")失败。要用新值填充序列,可以这样做:

g_without_nan = g.cat.add_categories("D").fillna("D")

填写前添加类别:

g = g.cat.add_categories([1])
g.fillna(1)

创建分类数据后,只能在类别中插入值。

>>> df
    ID  value
0    0     20
1    1     43
2    2     45
>>> df["cat"] = df["value"].astype("category")
>>> df
    ID  value    cat
0    0     20     20
1    1     43     43
2    2     45     45
>>> df.loc[1, "cat"] = np.nan
>>> df
    ID  value    cat
0    0     20     20
1    1     43    NaN
2    2     45     45
>>> df.fillna(1)
ValueError: fill value must be in categories
>>> df.fillna(43)
    ID  value    cat
0    0     20     20
1    1     43     43
2    2     45     45


正如许多人之前所说,这个错误是由于该功能的类型是'category'。
我建议首先将其转换为字符串,使用fillna,如果需要,最后将其转换回类别。

g = g.astype('string')
g = g.fillna(NAN_SUBSTITUTION_VALUE)
g = g.astype('category')

有时您可能希望用数据集中存在的值替换NaN,您可以使用它:

#creates a random permuation of the categorical values
permutation = np.random.permutation(df[field])
#erase the empty values
empty_is = np.where(permutation == "")
permutation = np.delete(permutation, empty_is)
#replace all empty values of the dataframe[field]
end = len(permutation)
df[field] = df[field].apply(lambda x: permutation[np.random.randint(end)] if pd.isnull(x) else x)

工作效率很高

深刻理解是因为:

范畴只能接受有限的,通常是固定数量的可能值(类别)。与统计分类变量相比,分类变量可能有顺序,但不能进行数值运算(加法、除法等)。

Categorical的所有值要么属于categories,要么属于np.nan。在类别之外赋值将引发ValueError。顺序由类别的顺序定义,而不是值的词法顺序。

https://pandas.pydata.org/docs/reference/api/pandas.Categorical.html

最新更新