如何统计DataFrame列表列中技能的出现次数及关联角色?
嘿,我懂你折腾数小时却没搞定的郁闷——这两个需求其实用 pandas 就能轻松实现,我给你一步步拆解,附带可直接运行的代码:
需求1:统计前10高频技能并生成计数DataFrame
首先我们需要把Skills列里的列表"展开",让每个技能单独占一行,之后就能用value_counts()统计频率了:
import pandas as pd # 先假设你的DataFrame名为df,这里给个示例数据方便你测试 data = { 'Role': ['Backend Dev', 'Data Scientist', 'Frontend Dev', 'Backend Dev'], 'Skills': [['Python', 'Django', '4G'], ['Python', 'SQL', 'ML'], ['JavaScript', 'React', '4G'], ['Python', 'Flask', '4G']] } df = pd.DataFrame(data) # 处理空值(如果你的数据里有空列表或NaN,先去掉) df = df.dropna(subset=['Skills']) # 展开Skills列的列表 skills_exploded = df.explode('Skills') # 统计前10高频技能,转成DataFrame并重命名列 top_10_skills = skills_exploded['Skills'].value_counts().head(10).reset_index() top_10_skills.columns = ['Skill', 'Count'] print("前10高频技能:") print(top_10_skills)
运行后你会得到一个两列的DataFrame,第一列是技能,第二列是对应的出现次数,完全符合你的需求。
需求2:生成技能-计数-对应角色列表的三列表格
这个需求需要我们按技能分组,同时统计计数和去重后的角色列表,用groupby()配合agg()就能实现:
# 基于刚才展开的skills_exploded数据分组聚合 skill_role_summary = skills_exploded.groupby('Skills').agg( Count=('Skills', 'count'), # 统计技能出现次数 Roles=('Role', lambda x: list(x.unique())) # 收集去重后的角色列表 ).reset_index() # 重命名列让它更清晰 skill_role_summary.columns = ['Skill', 'Count', 'Associated Roles'] print("\n技能-计数-角色列表:") print(skill_role_summary)
这段代码会生成一个三列的DataFrame:
- 第一列是所有技能
- 第二列是该技能的总出现次数
- 第三列是具备该技能的所有不同角色的列表(已经去重,不会重复显示同一个角色)
如果你的数据量比较大,这段代码也能高效运行——pandas的分组聚合在处理这类场景时很靠谱。
内容的提问来源于stack exchange,提问作者Avihay Shahar
相关产品推荐
相关产品推荐

