Dask DummyEncoder不会返回所有列

时间:2018-08-15 16:38:13

标签: python pandas dask one-hot-encoding

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

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

我如何获得相同的结果?之所以这样想,是因为我将对列的一个子集进行编码,然后将所得的encode_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内部使用大熊猫,因此我相信它使用get_dummiesDummyEncoder的行为方式。如果有人指出在熊猫中做同样的事情,也将不胜感激。

1 个答案:

答案 0 :(得分:1)

从dask的文档中获得有关DummyEncoder columns参数的信息:

  

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

此外,它说here,您必须始终使用Categorizer,然后再使用某些编码器(包括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