LabelEncoding 列组合的排列
LabelEncoding a permutation of combination of columns
我想使用 sklearn
的 LabelEncoder()
为两列的排列创建 class 标签。我如何实现以下行为?
import pandas as pd
import numpy as np
from sklearn.preprocessing import LabelEncoder
df = pd.read_csv("data.csv", sep=",")
df
# A B
# 0 1 Yes
# 1 2 No
# 2 3 Yes
# 3 4 Yes
我想要 A && B 组合的排列,而不是分别对这两列进行编码:
df['A'].astype('category')
#Categories (4, int64): [1, 2, 3, 4, ]
df['B'].astype('category')
#Categories (2, object): ['Yes','No']
#Column C should have 4 * 2 classes:
(1,Yes)=1 (1,No)=5
(2,Yes)=2 (2,No)=6
(3,Yes)=3 (3,No)=7
(4,Yes)=4 (4,No)=8
#Newdf
# A B C
# 0 1 Yes 1
# 1 2 No 6
# 2 3 Yes 3
# 3 4 Yes 4
我们可以用交叉创建映射 df merge
out = df.merge(df[['B']].drop_duplicates().merge(df['A'].drop_duplicates(),how='cross').assign(C=lambda x : x.index+1))
Out[415]:
A B C
0 1 Yes 1
1 2 No 6
2 3 Yes 3
3 4 Yes 4
更多信息
df[['B']].drop_duplicates().merge(df['A'].drop_duplicates(),how='cross').assign(C=lambda x : x.index+1)
Out[417]:
B A C
0 Yes 1 1
1 Yes 2 2
2 Yes 3 3
3 Yes 4 4
4 No 1 5
5 No 2 6
6 No 3 7
7 No 4 8
您可以创建额外的列,将 2 列的值合并到一个元组中。但是 LabelEncoder
不能对元组进行编码,所以你还需要得到元组的 hash()
:
df['AB'] = df.apply(lambda row: hash((row['A'], row['B'])), axis=1)
le = LabelEncoder()
df['C'] = le.fit_transform(df['AB'])
但是,如果您想保留准确的标签顺序(您指定的),使用 LabelEncoder()
没有意义。您可以像这样简单地计算 C
列:
df['C'] = df['A'] + (df['B']=='No') * df['A'].max()
输出:
A B C
0 1 Yes 1
1 2 No 6
2 3 Yes 3
3 4 Yes 4
编辑:
如果您想保留遗漏组合的标签(例如 (2, 'Yes')
)并且需要针对任意数量的 类 的解决方案,您可以使用 2 LabelEncoder()
:
leA = LabelEncoder()
leB = LabelEncoder()
leA.fit(df['A'])
leB.fit(df['B'])
df['C'] = leA.transform(df['A']) + leA.classes_.size
leB.transform(df['B']) + 1 # if you want labels to start from 1
但在这种情况下您无法保留自定义顺序,标签列表将自动排序,例如[1,2,3,4] 和 ['No','Yes'].
输出:
A B C
0 1 Yes 5
1 2 No 2
2 3 Yes 7
3 4 Yes 8
我想使用 sklearn
的 LabelEncoder()
为两列的排列创建 class 标签。我如何实现以下行为?
import pandas as pd
import numpy as np
from sklearn.preprocessing import LabelEncoder
df = pd.read_csv("data.csv", sep=",")
df
# A B
# 0 1 Yes
# 1 2 No
# 2 3 Yes
# 3 4 Yes
我想要 A && B 组合的排列,而不是分别对这两列进行编码:
df['A'].astype('category')
#Categories (4, int64): [1, 2, 3, 4, ]
df['B'].astype('category')
#Categories (2, object): ['Yes','No']
#Column C should have 4 * 2 classes:
(1,Yes)=1 (1,No)=5
(2,Yes)=2 (2,No)=6
(3,Yes)=3 (3,No)=7
(4,Yes)=4 (4,No)=8
#Newdf
# A B C
# 0 1 Yes 1
# 1 2 No 6
# 2 3 Yes 3
# 3 4 Yes 4
我们可以用交叉创建映射 df merge
out = df.merge(df[['B']].drop_duplicates().merge(df['A'].drop_duplicates(),how='cross').assign(C=lambda x : x.index+1))
Out[415]:
A B C
0 1 Yes 1
1 2 No 6
2 3 Yes 3
3 4 Yes 4
更多信息
df[['B']].drop_duplicates().merge(df['A'].drop_duplicates(),how='cross').assign(C=lambda x : x.index+1)
Out[417]:
B A C
0 Yes 1 1
1 Yes 2 2
2 Yes 3 3
3 Yes 4 4
4 No 1 5
5 No 2 6
6 No 3 7
7 No 4 8
您可以创建额外的列,将 2 列的值合并到一个元组中。但是 LabelEncoder
不能对元组进行编码,所以你还需要得到元组的 hash()
:
df['AB'] = df.apply(lambda row: hash((row['A'], row['B'])), axis=1)
le = LabelEncoder()
df['C'] = le.fit_transform(df['AB'])
但是,如果您想保留准确的标签顺序(您指定的),使用 LabelEncoder()
没有意义。您可以像这样简单地计算 C
列:
df['C'] = df['A'] + (df['B']=='No') * df['A'].max()
输出:
A B C
0 1 Yes 1
1 2 No 6
2 3 Yes 3
3 4 Yes 4
编辑:
如果您想保留遗漏组合的标签(例如 (2, 'Yes')
)并且需要针对任意数量的 类 的解决方案,您可以使用 2 LabelEncoder()
:
leA = LabelEncoder()
leB = LabelEncoder()
leA.fit(df['A'])
leB.fit(df['B'])
df['C'] = leA.transform(df['A']) + leA.classes_.size
leB.transform(df['B']) + 1 # if you want labels to start from 1
但在这种情况下您无法保留自定义顺序,标签列表将自动排序,例如[1,2,3,4] 和 ['No','Yes'].
输出:
A B C
0 1 Yes 5
1 2 No 2
2 3 Yes 7
3 4 Yes 8