如何让pandas get_dummies像DictVectorizer一样行动

时间:2017-09-01 20:25:15

标签: python pandas scikit-learn

考虑等于的数据框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生成的内容,而无需先从数据框转换为字典列表。

3 个答案:

答案 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='_'))

比较这个解决方案的速度会非常有趣。