python 中类似 SQL 行数据的单热编码器
One-hot encoder for SQL-like row data in python
我有遵循以下格式的数据。我对第一列没什么兴趣;然而,第二列和第三列是职位名称和该职位可能具有的示例技能(劳工统计局的经济学家生成了此数据。)
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
我想找到一个单一的向量化,其中工作是行,技能是列;如果相应的工作需要相应的技能(否则为 0),则单元格 (j,s) 接收值 1。
下面是我的"hard way"实现这种影响的方法。但是,是否有更简单的 pandas 方法来产生相同的结果?
import pandas as pd
import numpy as np
skill_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)
我所做的基本上是创建一个独特的职位列表,然后是一个独特技能的列表,然后创建一个以职位为键、空列表为值的字典。然后我遍历数据框行,将技能附加到刚才提到的字典的列表(值)中。接下来,我制作了另一个字典,以职位名称为键,空列表为值;这一次,我应用了一个 one hot 编码,其中 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]])
我相信你可以看出,这不是最佳的,因为计算原因以及用户错误的空间(许多变量需要重命名以在新数据上重复这个过程。)
如果有一种简单的方法可以实现这种效果,我真的很感兴趣!
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)
但这会return一个稍微不同的数组
我有遵循以下格式的数据。我对第一列没什么兴趣;然而,第二列和第三列是职位名称和该职位可能具有的示例技能(劳工统计局的经济学家生成了此数据。)
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
我想找到一个单一的向量化,其中工作是行,技能是列;如果相应的工作需要相应的技能(否则为 0),则单元格 (j,s) 接收值 1。
下面是我的"hard way"实现这种影响的方法。但是,是否有更简单的 pandas 方法来产生相同的结果?
import pandas as pd
import numpy as np
skill_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)
我所做的基本上是创建一个独特的职位列表,然后是一个独特技能的列表,然后创建一个以职位为键、空列表为值的字典。然后我遍历数据框行,将技能附加到刚才提到的字典的列表(值)中。接下来,我制作了另一个字典,以职位名称为键,空列表为值;这一次,我应用了一个 one hot 编码,其中 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]])
我相信你可以看出,这不是最佳的,因为计算原因以及用户错误的空间(许多变量需要重命名以在新数据上重复这个过程。)
如果有一种简单的方法可以实现这种效果,我真的很感兴趣!
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)
但这会return一个稍微不同的数组