并非所有类别都存在时的虚拟变量

新手上路,请多包涵

我有一组数据框,其中一列包含一个分类变量。我想将它转换为几个虚拟变量,在这种情况下我通常会使用 get_dummies

发生的事情是 get_dummies 查看每个数据框中可用的数据,找出有多少类别,从而创建适当数量的虚拟变量。然而,在我现在正在处理的问题中,我实际上提前知道可能的类别是什么。但是当单独查看每个数据框时,并非所有类别都一定会出现。

我的问题是:有没有办法将类别的名称传递给 get_dummies (或等效函数),这样,对于没有出现在给定数据框中的类别,它只是创建一列 0?

可以做到这一点的东西:

 categories = ['a', 'b', 'c']

   cat
1   a
2   b
3   a

变成这样:

   cat_a  cat_b  cat_c
1   1      0      0
2   0      1      0
3   1      0      0

原文由 Berne 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 451
2 个回答

使用转置和重建索引

import pandas as pd

cats = ['a', 'b', 'c']
df = pd.DataFrame({'cat': ['a', 'b', 'a']})

dummies = pd.get_dummies(df, prefix='', prefix_sep='')
dummies = dummies.T.reindex(cats).T.fillna(0)

print dummies

    a    b    c
0  1.0  0.0  0.0
1  0.0  1.0  0.0
2  1.0  0.0  0.0

原文由 piRSquared 发布,翻译遵循 CC BY-SA 3.0 许可协议

长话短说

 pd.get_dummies(cat.astype(pd.CategoricalDtype(categories=categories)))
  • 年长的熊猫: pd.get_dummies(cat.astype('category', categories=categories))

有没有办法将类别的名称传递给 get_dummies(或等效函数),以便对于未出现在给定数据框中的类别,它只会创建一列 0?

就在这里! Pandas 有一种特殊类型的 Series 仅用于 分类数据。该系列的属性之一是可能的类别, get_dummies 考虑在内。这是一个例子:

 In [1]: import pandas as pd

In [2]: possible_categories = list('abc')

In [3]: dtype = pd.CategoricalDtype(categories=possible_categories)

In [4]: cat = pd.Series(list('aba'), dtype=dtype)
In [5]: cat
Out[5]:
0    a
1    b
2    a
dtype: category
Categories (3, object): [a, b, c]

然后, get_dummies 将完全按照您的意愿行事!

 In [6]: pd.get_dummies(cat)
Out[6]:
   a  b  c
0  1  0  0
1  0  1  0
2  1  0  0

还有很多其他方法可以创建分类 SeriesDataFrame ,这只是我觉得最方便的一种。您可以在 pandas 文档 中阅读所有这些内容。

编辑:

我没有遵循确切的版本控制,但是 pandas 如何处理稀疏矩阵存在一个 错误,至少在版本 0.17.0 之前是这样。它已在 0.18.1 版(2016 年 5 月发布)中得到纠正。

对于版本 0.17.0,如果您尝试使用带有 DataFramesparse=True 选项来执行此操作,则缺少的虚拟变量的零列将是 NaN 的一列 --- ,它将被转换为密集。

看起来 pandas 0.21.0 添加了一个 CategoricalDType ,并创建明确包含原始答案中的类别的分类被弃用,我不太确定什么时候。

原文由 T.C. Proctor 发布,翻译遵循 CC BY-SA 4.0 许可协议

推荐问题