如何使大熊猫get_dummies像dictvectorizer一样行动



考虑等于:

的dataframe df
  apple  carrot pear
0     3       1     
1             3    2
2     4       1    3

我可以使用Sklearln的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

这似乎是苹果和梨列中每个值的分类变量,大概是因为该列现在具有非数字类型。这不是我想要的。在我的真实数据中,将有许多不同的数值值,而唯一的非数值是'',因此这将不必要地创建大量额外的列。

是否可以使get_dummies给出与Sklearn相同的输出 dictvectorizer?

通常,由于我的数据框将非常大,有什么方法可以直接转到Dictvectorizer所产生的,而无需先从数据框架转换为字典列表。

我无法让 pandas.get_dummies()这样工作,而且我认为它无法为某些值创建分类变量。

我做出了要提供您想要的输出的要点。它应用了一个函数,将null值替换为1,而不是为0的null值。然后,您可以将此新的数据框合并为原始数据框以获取所需的结果。

我不认为get_dummies可以做到。

但是,此答案使用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='_'))

比较该解决方案的速度非常有趣。

最新更新