У меня есть данные в следующем формате. Первый столбец меня мало интересует; однако во втором и третьем столбцах указаны название должности и пример навыка, которым, вероятно, обладает это название (экономисты из Бюро статистики труда создали эти данные). где задания - это строки, а навыки - столбцы; ячейка (j, s) получает значение 1, если соответствующая работа требует соответствующего навыка (иначе 0).
Ниже приведен мой "трудный путь" подхода к достижению этого эффекта. Однако существует ли более простой 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)
По сути, я занимаюсь созданием списка уникальных должностей, затем списка уникальных навыков, затем созданием словарь с названиями заданий в качестве ключей и пустыми списками в качестве значений. Затем я перебираю строки данных, добавляя навыки в списки (значения) только что упомянутого словаря. Затем я создаю другой словарь с названиями должностей в качестве ключей и пустыми списками в качестве значений; На этот раз я применяю одно горячее кодирование, где 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]])
Как я уверен, вы Можно сказать, что это не оптимально как по вычислительным причинам, так и по причине ошибки пользователя (многие переменные должны быть переименованы, чтобы повторить этот процесс для новых данных.)
Если есть простой способ выполнить sh этот эффект мне очень интересен!