考虑等于:
的dataframedf
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='_'))
比较该解决方案的速度非常有趣。