python - 在 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 不同,但情况并非如此
解决方案
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
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 - Heroku 上的 Django 项目部署失败
- javascript - 用作局部变量的未定义函数参数
- database - 时间序列数据库
- python - 如何找到线和轮廓之间的交点
- apache-kafka - Kafka 元数据不一致
- javascript - 自动生成的 id 的哈希在页面加载时不起作用
- flutter - 在 Flutter 应用程序中使用 Facebook 受众网络实现 admob 中介
- web - 因为违反内容安全策略而拒绝执行内联脚本(primefaces 8)
- python - 使用循环创建多个文件夹,并在此文件夹内保存 Excel 工作表
- java - 如何在java中使用lambda表达式编写弹性搜索代码