不存在所有类别时的虚拟变量

Ber*_*rne 38 python machine-learning pandas dummy-variable

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

会发生什么是get_dummies查看每个数据帧中可用的数据以找出有多少类别,从而创建适当数量的虚拟变量.但是,在我现在正在工作的问题中,我实际上事先知道可能的类别是什么.但是,当单独查看每个数据框时,并非所有类别都必须出现.

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

会有这样的东西:

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

   cat
1   a
2   b
3   a
Run Code Online (Sandbox Code Playgroud)

成为这个:

  cat_a  cat_b  cat_c
1   1      0      0
2   0      1      0
3   1      0      0
Run Code Online (Sandbox Code Playgroud)

T.C*_*tor 33

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

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

In [1]: import pandas as pd

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

In [3]: cat = pd.Series(list('aba'))

In [4]: cat = cat.astype('category', categories=possible_categories)

In [5]: cat
Out[5]: 
0    a
1    b
2    a
dtype: category
Categories (3, object): [a, b, c]
Run Code Online (Sandbox Code Playgroud)

然后,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
Run Code Online (Sandbox Code Playgroud)

还有很多其他方法可以创建一个分类,Series或者DataFrame这是我觉得最方便的方法.您可以在pandas文档中阅读所有这些内容.

编辑:

我没有遵循确切的版本,但是pandas如何处理稀疏矩阵存在一个错误,至少在版本0.17.0之前.它由版本0.18.1更正.

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


piR*_*red 26

使用转置和重新索引

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
Run Code Online (Sandbox Code Playgroud)

  • 同样`reindex`有一个`fill_value`参数,它可以完成你对`fillna`所做的工作.因此,打印结果之前的行可以通过以下方式完成:`dummies = dummies.reindex(columns = cats,fill_value = 0)`. (5认同)
  • 通过使用`reindex` 的`columns` 关键字(即`dummies.reindex(columns=cats)`),你不需要做双重转置。 (2认同)

小智 6

我确实在 pandas github 上问过这个问题。Categorical事实证明,当您将列定义为定义所有可能的类别时,绕过它真的很容易。

df['col'] = pd.Categorical(df['col'], categories=['a', 'b', 'c', 'd'])
Run Code Online (Sandbox Code Playgroud)

get_dummies()将按预期完成剩下的工作。