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

标签 python pandas machine-learning dummy-variable

我有一组数据框,其中一个列包含一个分类变量。我想将其转换为几个虚拟变量,在这种情况下,我通常会使用 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

最佳答案

TL;DR:

pd.get_dummies(cat.astype(pd.CategoricalDtype(categories=categories)))
  • Pandas :pd.get_dummies(cat.astype('category', categories=categories))

is there a way to pass to get_dummies (or an equivalent function) the names of the categories, so that, for the categories that don't appear in a given dataframe, it'd just create a column of 0s?

是的,有! Pandas 有一个特殊类型的 Series 仅用于 categorical data .本系列的属性之一是可能的类别,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,这只是我觉得最方便的一种。您可以在 the pandas documentation 中阅读所有这些内容。 .

编辑:

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

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

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

关于python - 并非所有类别都存在时的虚拟变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37425961/

相关文章:

python - 如何引用数据框中的单元格

python - 计算完整数据帧中每个 Sequence_ID 的最大频率

python - 如何在 tensorflow 中获得特定值和形状的张量?

java - MOA 的 StreamKM 聚类不返回任何结果

python - 使用基于另一行的条件删除组行

machine-learning - 高斯贝叶斯网络中的推理

python - Celery 与 Django 中的 Redis 代理 : tasks successfully execute, 但仍然存在太多持久的 Redis key 和连接

python - MIMEText 中的标题编码

python - 在 Django 中创建用户时出现以下错误 : type object 'User' has no attribute 'objects'

python - 在 Pandas 专栏中找到下一个工作日