Как насчет чего-то подобного?
Поскольку каждый из трех ваших словарей соответствует разным столбцам, которые вы хотите создать, мы можем создать еще одно сопоставление словаря с именами столбцов, которые скоро появятся в качестве ключей, истроки для поиска на каждом конкретном уровне в качестве значений (на самом деле, вам даже не нужен словарь для хранения элементов my_dict_<x>
- вместо этого вы можете использовать set
- но это не так уж и сложно):
>>> lookup = {'level_1': my_dict_1, 'level_2': my_dict_2, 'level_3': my_dict_3}
>>> lookup
{'level_1': {'bachelors': 1, 'bachelor': 1, 'ba': 1, 'science degree': 1, 'bs': 1, 'engineering degree': 1}, 'level_2': {'masters': 1, 'ms': 1, 'master': 1}, 'level_3': {'phd': 1, 'p.h.d': 1}}
Затем просмотрите каждый предложенный столбец в только что созданном словаре и назначьте новый столбец, который создает желаемый результат, проверяя для каждого уровня, указанного в каждом объекте my_dict_<x>
, принадлежит ли хотя бы один элемент в задании.описание в каждой строке ...
>>> for level, values in lookup.items():
... df[level] = df['job_description'].apply(lambda x: 1 if any(v in x for v in values) else 0)
...
>>> df
job_description level_1 level_2 level_3
0 masters degree required 0 1 0
1 bachelor's degree required 1 0 0
2 bachelor degree required 1 0 0
3 phd required 0 0 1
Другое решение, использующее класс CountVectorizer от scikit-learn, который считает частоты токенов (в основном слов), встречающихся в строках:
>>> from sklearn.feature_extraction.text import CountVectorizer
Укажите конкретный словарь - забудьте обо всех других словах, которые не являются ключевыми словами «академических полномочий»:
>>> vec = CountVectorizer(vocabulary={value for level, values in lookup.items() for value in values})
>>> vec.vocabulary
{'master', 'p.h.d', 'ba', 'ms', 'engineering degree', 'masters', 'phd', 'bachelor', 'bachelors', 'bs', 'science degree'}
Подгоните этот преобразователь к итерируемому тексту: df['job_description']
:
>>> result = vec.fit_transform(df['job_description'])
Более подробно рассмотрим результаты:
>>> pd.DataFrame(result.toarray(), columns=vec.get_feature_names())
ba bachelor bachelors bs engineering degree master masters ms p.h.d phd science degree
0 0 0 0 0 0 0 1 0 0 0 0
1 0 1 0 0 0 0 0 0 0 0 0
2 0 1 0 0 0 0 0 0 0 0 0
3 0 0 0 0 0 0 0 0 0 1 0
Этот последний подход может потребовать немного больше работы, если вы хотитечтобы вернуться к вашей level_<x>
структуре столбцов, но я подумал, что просто покажу это как другой способ думать о кодировании этих точек данных.