如果我有如下两列:
Origin Destination
China USA
China Turkey
USA China
USA Turkey
USA Russia
Russia China
我将如何执行标签编码,同时确保 Origin 列的标签与目标列中的标签相匹配,即
Origin Destination
0 1
0 3
1 0
1 0
1 0
2 1
如果我分别对每一列进行编码,那么算法会认为第 1 列中的中国与第 2 列中的中国不同,但事实并非如此
最佳答案
堆栈
df.stack().pipe(lambda s: pd.Series(pd.factorize(s.values)[0], s.index)).unstack()
Origin Destination
0 0 1
1 0 2
2 1 0
3 1 2
4 1 3
5 3 0
factorize
和 reshape
pd.DataFrame(
pd.factorize(df.values.ravel())[0].reshape(df.shape),
df.index, df.columns
)
Origin Destination
0 0 1
1 0 2
2 1 0
3 1 2
4 1 3
5 3 0
np.unique
和 reshape
pd.DataFrame(
np.unique(df.values.ravel(), return_inverse=True)[1].reshape(df.shape),
df.index, df.columns
)
Origin Destination
0 0 3
1 0 2
2 3 0
3 3 2
4 3 1
5 1 0
恶心的选择
我无法停止尝试……抱歉!
df.applymap(
lambda x, y={}, c=itertools.count():
y.get(x) if x in y else y.setdefault(x, next(c))
)
Origin Destination
0 0 1
1 0 3
2 1 0
3 1 3
4 1 2
5 2 0
正如 cᴏʟᴅsᴘᴇᴇᴅ 指出的那样
您可以通过分配回数据框来缩短它
df[:] = pd.factorize(df.values.ravel())[0].reshape(df.shape)
关于python - scikit-learn 中具有相同属性的跨多列的标签编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50264334/