在多列中使用 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 列?
假设我在 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 列?