如何让pandas获取哑变量表现像DictVectorizer

2024-04-19 14:53:19 发布

您现在位置:Python中文网/ 问答频道 /正文

考虑数据帧df,它等于:

  apple  carrot pear
0     3       1     
1             3    2
2     4       1    3

我可以使用sklearn的dictvector对其进行热编码,如下所示:

^{pr2}$

这样可以得到:

array([[ 3.,  0.,  1.,  0.,  1.],
       [ 0.,  1.,  3.,  2.,  0.],
       [ 4.,  0.,  1.,  3.,  0.]])

我们可以看到列的特征名称:

enc.feature_names_
['apple', 'apple=', 'carrot', 'pear', 'pear=']

因此,我们可以看到第二列指示apple列是否持有''。在

如果我们想得到同样的结果:

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列中的每个值生成了一个分类变量,大概是因为该列现在有一个非数字类型。这不是我想要的。在我的实际数据中,会有很多不同的数值,唯一的非数值是'',因此这将不必要地创建大量的额外列。在

Is it possible to make get_dummies give the same output as sklearn's DictVectorizer?

一般来说,由于我的数据帧非常大,有没有任何方法可以直接转到DictVectorizer生成的内容,而不必先从数据帧转换为字典列表。在


Tags: 数据apple编码dfget特征sklearnarray
3条回答

我不能让pandas.get_dummies()像这样工作,而且我不认为它被设置为只能为某些值创建分类变量。在

我制作了this Gist,它提供了您想要的输出。它applies是一个用1代替空值,用0代替非空值的函数。然后,您可以将这个新的数据帧与原始的数据帧合并以获得所需的结果。在

我认为get_dummies做不到。在

但是this answer使用DictVectorizer直接传递数据帧,它将避免转换为dict。在

以下(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='_'))

比较一下这个解决方案的速度是非常有趣的。在

相关问题 更多 >