如何将Python DataFrame硬技能列转为列表格式并优化代码?
解决方法
一、修改现有函数,直接返回列表
你之前手动拼接列表格式字符串容易踩坑(比如引号转义、逗号遗漏),不如直接在函数里收集匹配的技能为列表,返回实际的列表对象:
首先定义函数:
def get_hard_skills(skill_str, hard_skills_ref): # 拆分逗号分隔的字符串,同时去除每个技能前后的空格 raw_skills = [s.strip() for s in skill_str.split(',')] # 筛选出属于硬技能参考列表的项 matched_hard_skills = [skill for skill in raw_skills if skill in hard_skills_ref] return matched_hard_skills
然后应用到DataFrame:
# 假设你的硬技能参考列表是这个 hard_skills_ref = ["Python Programming", "Machine Learning", "SQL", "Data Visualization"] # 生成新列 df['hard skills'] = df['skills'].apply(get_hard_skills, hard_skills_ref=hard_skills_ref)
这样生成的hard skills列就是Python列表类型,后续处理更方便。如果确实需要字符串形式的列表(比如"['Python Programming', 'Machine Learning']"),只需在函数返回时用str(matched_hard_skills)即可。
二、更高效的向量化处理(适合大数据量)
如果你的DataFrame行数很多,apply循环效率较低,可以用向量化操作结合集合优化查找速度:
# 先把硬技能列表转成集合,提升查找效率(集合查找是O(1),列表是O(n)) hard_skills_set = set(hard_skills_ref) # 拆分skills列为列表并清洗空格 df['skills_list'] = df['skills'].str.split(',').apply(lambda x: [s.strip() for s in x]) # 筛选匹配的硬技能,生成新列 df['hard skills'] = df['skills_list'].apply(lambda x: [skill for skill in x if skill in hard_skills_set])
如果不介意技能顺序被打乱,还可以用集合交集进一步简化:
df['hard skills'] = df['skills_list'].apply(lambda x: list(set(x) & hard_skills_set))
为什么手动拼接字符串容易失败?
手动拼列表格式字符串需要处理很多细节:比如每个技能要加单引号、技能之间的逗号、首尾的方括号,一旦有技能本身包含特殊字符(比如单引号)就会出错。直接返回列表对象既可靠又方便后续操作。
内容的提问来源于stack exchange,提问作者Lauren
相关产品推荐
相关产品推荐

