Как двоично кодировать два смешанных объекта?

У меня есть набор данных, похожий на этот:

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 Pipeline и / или sklearn_pandas DataFrameMapper (должен воспроизводиться на тестовом образце).

На данный момент я попытался использовать 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_B_0", "A_B_1" и т. Д.

Есть ли способ добиться желаемого результата?

1 ответ

Учитывая, что число различных значений для столбцов A и B равно n_A а также n_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
Другие вопросы по тегам