如何统计Data Scientist职位描述中指定技能词的出现频率?
问题
我有个从Glassdoor爬取的DataFrame df,包含Job Title和Job Description两列,数据样例如下:
| Job Title | Job Description |
|---|---|
| Data Scientist | 职位描述内容 |
| Data Scientist | 职位描述内容 |
| Data Engineer | 职位描述内容 |
| Data Scientist | 职位描述内容 |
| Data Analyst | 职位描述内容 |
现在要针对Job Title为Data Scientist的记录,统计指定技能列表(Python、R、C/C++、Java、Machine Learning、Deep Learning、NLP、Power BI、Tableau、Excel、spark、aws、MS Access、LMS、SAS)在Job Description中的出现频率,输出包含skills和frequency列的DataFrame,样例如下:
| skills | frequency |
|---|---|
| python | 243 |
| R | 109 |
| power bi | 183 |
| tableau | 201 |
我试了两种方法都存在问题:
- 方法一:会统计描述中所有词汇的频率,并非仅指定技能词
(df .loc[df['Job Title'].eq('Data Scientist'), 'Job Description'] .str.split(',\s*') .explode() .value_counts() ) - 方法二:可统计单个技能词的出现次数,但需逐个输入技能词,效率低下
test = df['Job Description'].apply(lambda x: 1 if 'python' in x.lower()else 0) test.value_counts()
求高效的解决方案。
解决方案
思路
先筛选出所有Job Title为Data Scientist的职位描述,批量遍历指定技能列表,检查每个技能是否出现在描述中(不区分大小写),最后将统计结果整理成目标格式的DataFrame。
代码实现
import pandas as pd # 定义要统计的技能列表 target_skills = ['Python', 'R', 'C/C++', 'Java', 'Machine Learning', 'Deep Learning', 'NLP', 'Power BI', 'Tableau', 'Excel', 'spark', 'aws', 'MS Access', 'LMS', 'SAS'] # 筛选Data Scientist的职位描述,统一转小写避免大小写匹配误差 ds_jd = df.loc[df['Job Title'] == 'Data Scientist', 'Job Description'].str.lower() # 批量统计每个技能的出现次数 skill_freq = [] for skill in target_skills: # 统计包含该技能的描述数量(True会被视为1,sum直接累加次数) freq = ds_jd.str.contains(skill.lower()).sum() skill_freq.append({'skills': skill.lower(), 'frequency': freq}) # 转为目标DataFrame,可选按频率降序排序 result_df = pd.DataFrame(skill_freq).sort_values('frequency', ascending=False).reset_index(drop=True) print(result_df)
可选优化(精确匹配)
如果担心技能词被部分匹配(比如Python被误匹配为Pythonic),可以用正则表达式的单词边界实现精确匹配,需要先导入re模块:
import re # 修改统计部分的代码 freq = ds_jd.str.contains(r'\b' + re.escape(skill.lower()) + r'\b').sum()
这样只会匹配完整的技能词,避免误统计情况。
内容的提问来源于stack exchange,提问作者Atif
相关产品推荐
相关产品推荐

