微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用字典计算python数据帧中的字频率

我有一个由文本作业描述和3个空列组成的数据框

   index   job_description                 level_1      level_2        level_3
    0      this job requires masters in..    0             0              0
    1      bachelor degree needed for..      0             0              0
    2      ms is preferred or phd..          0             0              0

我正在尝试浏览每个作业描述字符串并计算作业描述中提到的每个学位级别的频率.示例输出应如下所示.

   index   job_description                 level_1      level_2        level_3
    0      this job requires masters in..    0             1              0
    1      bachelor degree needed for..      1             0              0
    2      ms is preferred or phd..          0             1              1

我创建了字典以进行比较,如下所示,但我对如何在数据框“作业描述”列的字符串中查找这些单词并根据单词是否存在填充数据框列有点无能为力.

my_dict_1 = dict.fromkeys(['bachelors', 'bachelor', 'ba','science
                           degree','bs','engineering degree'], 1)
my_dict_2 = dict.fromkeys(['masters', 'ms', 'master'], 1)
my_dict_3 = dict.fromkeys(['phd','p.h.d'], 1)

我非常感谢对此的支持..

解决方法:

这样的事怎么样?

由于您的三个词典中的每一个都对应于您要创建的不同列,因此我们可以创建另一个字典映射,其中即将成为列的名称作为键,并且在每个特定级别搜索的字符串作为值(实际上,您甚至不需要用于存储my_dict_< x>项目的字典 – 你可以使用一套 – 但这不是一个大问题:

>>> 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

另一种解决方案,使用scikit-learn的CountVectorizer类,它计算字符串中出现的标记(基本上是单词)的频率:

>>> 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>,那么最后一种方法可能需要更多的工作.列结构,但我想我只是将它作为一种思考编码这些数据点的不同方式.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐