Горячий кодер для SQL -подобных данных строки в python - PullRequest
0 голосов
/ 15 апреля 2020

У меня есть данные в следующем формате. Первый столбец меня мало интересует; однако во втором и третьем столбцах указаны название должности и пример навыка, которым, вероятно, обладает это название (экономисты из Бюро статистики труда создали эти данные). где задания - это строки, а навыки - столбцы; ячейка (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 этот эффект мне очень интересен!

1 Ответ

2 голосов
/ 15 апреля 2020

Используйте 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)

но это вернет несколько другой массив

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...