在多列中使用 OneHotEncoder,并在列之间重复类别?

Using OneHotEncoder in multiple columns with repetead categories amongst columns?

假设我在 3 列中有 4 个类别,但这些类别在列之间重复。例如....

df1 = pd.DataFrame(data=[['a', 'b', 'c'], ['b', 'a', 'd'], ['a', 'c', 'd'], ['b', 'd', 'a']])
   0  1  2
0  a  b  c
1  b  a  d
2  a  c  d
3  b  d  a

当我转换时,我得到 8 列,而我应该只得到 4 列(每个类别(a、b、c 和 d)一个)。

ohe = ColumnTransformer([('ohe', OneHotEncoder(categories='auto', sparse=False), [0, 1, 2])], remainder='passthrough')

df2 = ohe.fit_transform(df1)

作为 df2 八列类别,但我只想获得四个...每个 'a'、'b'、'c' 和 'd' 类别分配一个在我的专栏中。

有什么办法可以得到这个输出吗?

Out[17]: 
   a  b  c  d
0  1  1  1  0
1  1  1  0  1
2  1  0  1  1
3  1  1  0  1

更新

I want to obtain only four... one for each 'a', 'b', 'c' and 'd' categories distributed in my columns

您可以使用 value_counts 应用于列轴:

>>> df1.apply(pd.value_counts, axis="columns").fillna(0).astype(int)
   a  b  c  d
0  1  1  1  0
1  1  1  0  1
2  1  0  1  1
3  1  1  0  1

旧答案

关于编码工作原理的一些解释:

>>> df1
   W  X  Y  Z
0  a  b  c  c
1  b  a  a  b
2  a  c  a  b

>>> df1.nunique()
W    2  # [a, b]
X    3  # [a, b, c]
Y    2  # [a, c]
Z    2  # [b, c]

对于列 W,有两个不同的值 [a, b] 因此您需要 2 列来对它们进行编码:例如:

   a  b
a  1  0
b  0  1

对于列 X,有三个不同的值 [a, b, c],因此您需要 3 列来对它们进行编码。例如:

   a  b  c
a  1  0  0
b  0  1  0
c  0  0  1

注意单位矩阵。

让我们使用 pd.get_dummies 而不是 OneHotEncoder 来更好地理解:

>>> pd.get_dummies(df1)
   W_a  W_b  X_a  X_b  X_c  Y_a  Y_c  Z_b  Z_c
0    1    0    0    1    0    0    1    0    1
1    0    1    1    0    0    1    0    1    0
2    1    0    0    0    1    1    0    1    0

问题是为什么你只想得到 3 列?