Dask DummyEncoder 不返回所有列

Asi*_*Ali 3 python pandas dask one-hot-encoding

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

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)
Run Code Online (Sandbox Code Playgroud)

输出:

   B_a

0    1
1    1
Run Code Online (Sandbox Code Playgroud)

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

testD = pd.DataFrame({'B': ['a','a', 'b', 'c']})
Run Code Online (Sandbox Code Playgroud)

结果是:

   B_a  B_b  B_c
0    1    0    0
1    1    0    0
2    0    1    0
3    0    0    1
Run Code Online (Sandbox Code Playgroud)

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_)
Run Code Online (Sandbox Code Playgroud)

输出:

     1    2    3
0  0.0  1.0  0.0
1  0.0  1.0  0.0
Run Code Online (Sandbox Code Playgroud)

我如何获得相同的结果?我想要这种方式的原因是因为我将对列的子集进行编码,然后将结果 encoding_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
Run Code Online (Sandbox Code Playgroud)

预期输出:

   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
Run Code Online (Sandbox Code Playgroud)

编辑:

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

Qus*_*man 6

来自 dask 的DummyEncoder columns参数文档:

要虚拟编码的列。必须是分类 dtype
默认情况下,虚拟对所有分类 dtype 列进行编码。

此外,它在这里说在使用某些编码器(包括)之前必须始终使用 a 。CategorizerDummyEncoder

一个正确的方法来做到这一点:

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

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

pipe.fit(data)

pipe.transform(testD)
Run Code Online (Sandbox Code Playgroud)

这将输出:

    B_a     B_b     B_c
0   1       0       0
1   1       0       0
Run Code Online (Sandbox Code Playgroud)