Как двоично кодировать два смешанных объекта?
У меня есть набор данных, похожий на этот:
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