Python 熊猫-在分类数据中填充NAN

Python 熊猫-在分类数据中填充NAN,python,pandas,Python,Pandas,我正在尝试使用下面的代码填充缺少的值(NAN) NAN_SUBSTITUTION_VALUE = 1 g = g.fillna(NAN_SUBSTITUTION_VALUE) 但是我得到了以下错误 ValueError: fill value must be in categories. 请大家解释一下这个错误。一旦创建了分类数据,就只能在分类中插入值 >>> df ID value 0 0 20 1 1 43 2 2 4

我正在尝试使用下面的代码填充缺少的值(NAN)

NAN_SUBSTITUTION_VALUE = 1
g = g.fillna(NAN_SUBSTITUTION_VALUE)
但是我得到了以下错误

ValueError: fill value must be in categories.
请大家解释一下这个错误。

一旦创建了分类数据,就只能在分类中插入值

>>> 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

填写前添加类别:

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

您的问题缺少了重要的一点
g
是什么,特别是它有dtype
category
。我想是这样的:

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")

有时,您可能希望用数据集中的值替换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)

它的工作效率相当高。


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

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

亲爱的黑客代码,显然我搜索过了,当我什么都找不到时,我在这里创建了一个帐户,并询问了同行。再加上,我不是任何学生,也不是家庭作业的一部分,只是出于热情,我正在学习Python并尝试不同的东西。我认为这是一个知识共享平台,不是为了批评地面。只是一个侧面:当使用直接应用于数据帧时,我必须指定列才能使其工作:
g[cat\u column\u name]=g[cat\u column\u name].cat.add\u categories([1])
。如果已经订购了类别,那么添加的类别将是最大的。您解决问题的方法非常简单。你能再加些文字吗?我觉得太难理解了