python - Dask DummyEncoder 不返回所有列

标签 python pandas dask one-hot-encoding

我尝试使用 dask DummyEncoder对于 OneHotEncoding 我的数据。但结果并不如预期。

dask 的 DummyEncoder 示例:

from dask_ml.preprocessing import DummyEncoder
import pandas as pd

data = pd.DataFrame({
                'B': ['a', 'a', 'a', 'b','c']
                    })
de = DummyEncoder()
de = de.fit(data)
testD = pd.DataFrame({'B': ['a','a']})
trans = de.transform(testD)
print(trans)

输出:

   B_a

0    1
1    1

为什么不显示B_bB_c?但是当我将 testD 更改为:

testD = pd.DataFrame({'B': ['a','a', 'b', 'c']})

结果是:

   B_a  B_b  B_c
0    1    0    0
1    1    0    0
2    0    1    0
3    0    0    1

sklearn 的 OneHotEncoder 示例(在 LabelEncoding 之后):

from sklearn.preprocessing import OneHotEncoder
import pandas as pd

data = pd.DataFrame({
                'B': [1, 1, 1, 2, 3]
})
encoder = OneHotEncoder()
encoder = encoder.fit(data)
testdf = pd.DataFrame({'B': [2, 2]})
trans = encoder.transform(testdf).toarray()
pd.DataFrame(trans, columns=encoder.active_features_)

输出:

     1    2    3
0  0.0  1.0  0.0
1  0.0  1.0  0.0

如何获得相同的结果?我之所以这样想,是因为我将对列的子集进行编码,然后将生成的 encoded_df 连同从主 df 中删除的主列连接到主 df。

所以像下面这样(主要 df):

   A  B   C
0  M  1  10
1  F  2  20
2  T  3  30
3  M  4  40
4  F  5  50
5  F  6  60

预期输出:

   A_F  A_M  A_T  B   C
0    0    1    0  1  10
1    1    0    0  2  20
2    0    0    1  3  30
3    0    1    0  4  40
4    1    0    0  5  50
5    1    0    0  6  60

编辑:

由于 dask 内部使用 pandas,我相信它使用 get_dummies。这就是 DummyEncoder 的行为方式。如果有人能指出一种在 Pandas 中做同样事情的方法,我们也将不胜感激。

最佳答案

来自 dask 的 DummyEncoder columns 参数文档:

The columns to dummy encode. Must be categorical dtype.
Dummy encodes all categorical dtype columns by default.

另外,它说 here在使用某些编码器(包括 DummyEncoder)之前,您必须始终使用分类器

正确的做法是:

from dask_ml.preprocessing import Categorizer, DummyEncoder
from sklearn.pipeline import make_pipeline

pipe = make_pipeline(
    Categorizer(), DummyEncoder())

pipe.fit(data)

pipe.transform(testD)

将输出:

    B_a     B_b     B_c
0   1       0       0
1   1       0       0

关于python - Dask DummyEncoder 不返回所有列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51862846/

相关文章:

python - 根据条件从现有数据框创建新数据框

python - 在 Dask 中使用尚未实现的 Pandas 函数

python - mypy 在导入子模块 : Module has no attribute 时出错

python - 如果 python 变量的 id 小于 -6,为什么它会发生变化

python - Pandas 保留索引排序

python - 如何检查dask数据框是否为空

python - 使用 Dask 处理大型、压缩的 csv 文件

python - 如何在某些条件下对 pandas 数据框进行分组

python - 如何使用 django-admin 面板或管理员帐户发送 Firebase 通知?

Python-当另一列中的数字大于2之前的数字时,将列中的x值保存到列表中