熊猫 - 在分类数据中填写NaN

时间:2015-09-22 13:47:19

标签: python pandas

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

NAN_SUBSTITUTION_VALUE = 1
g = g.fillna(NAN_SUBSTITUTION_VALUE)

但是我收到以下错误

ValueError: fill value must be in categories.

有人请说明这个错误。

5 个答案:

答案 0 :(得分:28)

在填写之前添加类别:

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

答案 1 :(得分:25)

您的问题遗漏了<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.3/css/select2.min.css"> <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.3/js/select2.full.min.js"></script> <select name="name"> <option disabled>Vasia</option> <option>Petia</option> <option>Stas</option> </select>的重点,特别是它有d g。我认为它是这样的:

categorical

您遇到的问题是g = pd.Series(["A", "B", "C", np.nan], dtype="category") 需要一个已作为类别存在的值。例如,fillna可行,但g.fillna("A")失败。要使用新值填充系列,您可以执行以下操作:

g.fillna("D")

答案 2 :(得分:4)

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

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

答案 3 :(得分:1)

有时您可能想用数据集中存在的值替换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)

它非常有效。

答案 4 :(得分:0)


正如许多人之前所说,此错误源于该功能的类型为“类别”的事实。
我建议先将其转换为字符串,然后使用fillna,最后根据需要将其转换回类别。

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