考虑等于的数据框df
:
apple carrot pear
0 3 1
1 3 2
2 4 1 3
我可以使用sklearn的DictVectorizer对其进行单热编码,如下所示:
from sklearn.feature_extraction import DictVectorizer
enc = DictVectorizer(sparse = False)
enc.fit_transform(df.T.to_dict().values())
这给出了:
array([[ 3., 0., 1., 0., 1.],
[ 0., 1., 3., 2., 0.],
[ 4., 0., 1., 3., 0.]])
我们可以看到列的功能名称:
enc.feature_names_
['apple', 'apple=', 'carrot', 'pear', 'pear=']
因此,我们可以看到第二列显示苹果列是否保持''
为例。
如果我们尝试get_dummies
同样的事情,我们会得到:
pd.get_dummies(df)
carrot apple_3 apple_4 apple_ pear_2 pear_3 pear_
0 1 1 0 0 0 0 1
1 3 0 0 1 1 0 0
2 1 0 1 0 0 1 0
这似乎为apple和pear列中的每个值创建了一个分类变量,可能是因为该列现在具有非数字类型。这不是我想要的。在我的真实数据中,会有许多不同的数值,唯一的非数值是''
,所以这会不必要地创建大量的额外列。
是否可以使get_dummies提供与sklearn相同的输出 DictVectorizer?
一般来说,由于我的数据框架非常大,有没有办法直接转到DictVectorizer生成的内容,而无需先从数据框转换为字典列表。
答案 0 :(得分:1)
我无法让Parameter
像这样工作,我认为它不能仅为某些值创建分类变量。
我让this Gist提供了你想要的输出。它applies一个用空值替换空值的函数,而不是用0替换空值。然后可以将这个新的DataFrame与原始数据合并,以获得你想要的结果。
答案 1 :(得分:1)
我认为get_dummies
无法做到这一点。
但是this answer使用DictVectorizer
直接传递数据框,它将避免转换为dict
。
答案 2 :(得分:0)
以下(由pratapvardhan撰写)有效:
dfn = df.apply(pd.to_numeric, errors='coerce').isnull() # or df.applymap(np.isreal)
df.mask(dfn, 0).join(pd.get_dummies(df.where(dfn)).filter(like='_'))
比较这个解决方案的速度会非常有趣。