为了账号安全,请及时绑定邮箱和手机立即绑定

在 python 中用于类似 SQL 的行数据的 One-hot 编码器

在 python 中用于类似 SQL 的行数据的 One-hot 编码器

繁星淼淼 2022-10-11 21:37:30
我有遵循以下格式的数据。我对第一列没什么兴趣;但是,第二列和第三列是职位名称和该职位可能具有的示例技能(劳工统计局的经济学家提供了此数据。)O*NET-SOC Code  Title               Example 11-1011.00      Chief Executives    Adobe Systems Adobe Acrobat 11-1011.00      Chief Executives    AdSense Tracker 43232306    11-1011.00      Chief Executives    Atlassian JIRA  我想找到一个单热向量化,其中工作是行,技能是列;如果相应的工作需要相应的技能,则单元格 (j,s) 的值为 1(否则为 0)。以下是我实现这种影响的“艰难方式”。但是,是否有更简单的 pandas 方法来产生相同的结果?import pandas as pdimport numpy as npskill_data = pd.read_csv('Technology Skills.csv')jobs = [job for job in skill_data['Title'].unique()]skills = [skill for skill in skill_data['Example'].unique()]job_skill_dict = {name:[] for name in jobs}for idx,row in skill_data.iterrows():  job_skill_dict[row[1]].append(row[2])job_skill_vectors = {name:[] for name in jobs}for job, skill_list in job_skill_dict.items():  job_skill_vectors[job] = [1 if skill in skill_list else 0 for skill in skills]vectors = [job_skill_vectors[job] for job in jobs]job_skill_matrix = np.array(vectors) 我所做的基本上是创建一个独特职位列表,然后是一个独特技能列表,然后创建一个字典,其中职位名称作为键,空列表作为值。然后我遍历数据框行,将技能附加到刚刚提到的字典的列表(值)中。接下来,我制作另一个字典,其中职位名称作为键,空列表作为值;这一次,我应用了一个热编码,其中 1 或 0 按技能列表的顺序为每个技能提供。最后,我将所有这些字典值(一个热向量的列表)按作业列表的顺序转储到一个巨大的列表中。最后,我从这个列表列表中创建了一个 numpy 数组......最终结果看起来像这样(这是期望的!)job_skill_matrix>>>array([[1, 1, 1, ..., 0, 0, 0],       [0, 0, 0, ..., 0, 0, 0],       [1, 0, 1, ..., 0, 0, 0],       ...,       [0, 0, 0, ..., 0, 0, 0],       [0, 0, 0, ..., 1, 1, 0],       [0, 0, 0, ..., 0, 0, 1]])正如我确信您可以说的那样,这不是最优的,因为计算原因以及用户错误的空间(许多变量需要重命名才能对新数据重复此过程。)如果有一种简单的方法可以实现这种效果,我真的很感兴趣!
查看完整描述

1 回答

?
慕标琳琳

TA贡献1830条经验 获得超9个赞

使用pd.get_dummies

df_dummies = pd.get_dummies(df.set_index('Title')['Example'])

如果你想要一个numpy

df_dummies.to_numpy()
#df_dummies.values

我们也可以使用类似的东西:

df.pivot_table(index='Title', columns='Example', aggfunc='any').astype(int)

但这会返回一个稍微不同的数组


查看完整回答
反对 回复 2022-10-11
  • 1 回答
  • 0 关注
  • 108 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信