并非所有类别都存在时的虚拟变量
machine-learning
pandas
python
8
0

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

发生的事情是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
参考资料:
Stack Overflow
收藏
评论
共 5 个回答
高赞 时间 活跃

我确实在熊猫github上问过这个问题。事实证明,将列定义为定义所有可能类别的“ Categorical ,解决它确实很容易。

df['col'] = pd.Categorical(df['col'], categories=['a', 'b', 'c', 'd'])

get_dummies()将按预期执行其余操作。

收藏
评论

我不认为get_dummies是开箱即用的,它仅允许创建一个额外的column来突出显示NaN值。

要自己添加缺少的columns ,您可以使用pd.concat沿axis=0垂直“堆叠” DataFrames (虚拟列和DataFrame id )并自动创建任何缺少的列,使用fillna(0)替换缺少的值,然后使用.groupby('id')再次分隔各个DataFrame

收藏
评论

尝试这个:

In[1]: import pandas as pd
       cats = ["a", "b", "c"]

In[2]: df = pd.DataFrame({"cat": ["a", "b", "a"]})

In[3]: pd.concat((pd.get_dummies(df.cat, columns=cats), pd.DataFrame(columns=cats))).fillna(0)
Out[3]: 
     a    b    c
0  1.0  0.0  0
1  0.0  1.0  0
2  1.0  0.0  0
收藏
评论

使用转置和重新索引

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
收藏
评论

TL; DRpd.get_dummies(cat.astype('category', categories=categories)

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

就在这里!熊猫有一种特殊的系列,仅用于分类数据 。该系列的属性之一是可能的类别,该get_dummies考虑了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]

然后, 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文档中阅读所有这些内容

编辑:

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

对于0.17.0版,如果尝试使用带有DataFramesparse=True选项执行此DataFrame ,则缺少的虚拟变量的零列将是NaN列,并将其转换为稠密。

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号