首页 > 解决方案 > 在 sckit-learn 中跨多个具有相同属性的列进行标签编码

问题描述

如果我有如下两列:

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  

如果我分别对每一列进行编码,那么算法将看到 column1 中的中国与 column2 不同,但情况并非如此

标签: pythonpandasscikit-learn

解决方案


stack

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

factorizereshape

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.uniquereshape

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)

推荐阅读