如何对两个混合特征进行二进制编码?

2024-10-02 18:17:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我有这样一个数据集:

import pandas as pd

pd.DataFrame({"A": [2, 2, 1, 0, 5, 3, 0, 4, 5], "B": [1, 0, 0, 0, 1, 1, 1, 0, 0]})

   A  B
0  2  1
1  2  0
2  1  0
3  0  0
4  5  1
5  3  1
6  0  1
7  4  0

(我知道A在0和5之间;B仅为0或1)

我想将其转换为:

    A0_B0 A1_B0 A2_B0 A3_B0 ...  A5_B1
0   0     0     0     0     ...
1   0     0     1     0     ...
2   0     1     0     0     ...
...

(知道哪列对应哪种组合很重要)

使用可与sklearn管道和/或sklearn数据帧映射器集成的方法(需要在测试样本上可复制)

目前,我已经尝试使用OneHotEncoder或LabelBinarizer,但它们适用于A或B列,而不混合它们

我还尝试使用自定义转换器手动创建它,但DataFrameMapper丢失了列名:

from sklearn.base import BaseEstimator, TransformerMixin

class ABTransformer(BaseEstimator, TransformerMixin):
    def fit(self, x, y=None):
        return self

    def transform(self, x):
        A = x.A
        B = x.B

        A0_B0 = np.logical_and((A==0), (B == 0))
        A1_B0 = np.logical_and((A==1), (B == 0))
        ...

       data = pd.DataFrame(np.stack((A0_B0, A1_B0,.... ), axis=1), 
             columns=["A0_B0", "A1_B0", ...]
       )
       return data


 mapper = DataFrameMapper([
        (["A", "B"], [ABTransformer()] ,  {'input_df':True, "alias": None}),
        ],
        df_out=True, sparse=False)

最后,我得到的数据被标记为:“A\u B\u 0”、“A\u B\u 1”等

有没有办法达到预期的产出


Tags: 数据importselfdataframedefa1npsklearn
1条回答
网友
1楼 · 发布于 2024-10-02 18:17:08

假设列A和B的不同值的数目分别为n_An_B,并且所有值都表示为基于零的整数,那么可以使用以下转换函数

def transform(self, x):
    indices = x.B * n_A + x.A
    columns = ["A%d_B%d" % (j, i) for i in range(n_B) for j in range(n_A)]
    onehot = np.eye(n_A * n_B)[indices]
    data = pd.DataFrame(data=onehot, columns=columns)
    return data

相关问题 更多 >