我有一组数据框,其中一个列包含一个分类变量。我想将其转换为几个虚拟变量,在这种情况下,我通常会使用 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
还有很多其他方法可以创建分类 Series
或 DataFrame
,这只是我觉得最方便的一种。您可以在 the pandas documentation 中阅读所有这些内容。 .
编辑:
我没有遵循确切的版本,但是有一个 bug至少在 0.17.0 版之前,pandas 如何处理稀疏矩阵。版本 0.18.1(2016 年 5 月发布)已对其进行了更正。
对于 0.17.0 版,如果您尝试使用带有 DataFrame
的 sparse=True
选项执行此操作,则缺少的虚拟变量的零列将是一列NaN
,会被转换成dense。
看起来 pandas 0.21.0 添加了一个 CategoricalDType
,并且创建明确包含原始答案中的类别的分类已被弃用,我不太确定何时。
关于python - 并非所有类别都存在时的虚拟变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37425961/