如何在R语言中移除skill.set列数据集合重复的行(保留lift最高项)
高效处理技能集合去重并保留最高lift值的方法
嘿,这个场景我之前处理招聘类数据时碰到过,给你几个比朴素转向量高效得多的实现方案,核心思路是先把无序的技能字符串转换成标准化的分组标识,再按分组取最大值:
核心思路
不管技能的顺序如何(比如"Excel, PowerPoint"和"PowerPoint, Excel"),我们可以把它们转换成同一个标准化标识(比如排序后拼接成固定顺序的字符串),这样相同技能集合的记录就会被分到同一组,之后只需要在每组里保留lift值最高的那条就行。
方法一:标准化字符串分组(可读性高)
用pandas的矢量化操作完成,适合中等数据量,代码清晰易懂:
import pandas as pd # 模拟你的数据集 df = pd.DataFrame({ 'lift': [3.2, 4.5, 2.8, 5.1], 'skill.set': ["Excel, PowerPoint", "PowerPoint, Excel", "Python, SQL", "SQL, Python"] }) # 生成标准化的技能分组标识:拆分字符串→去除空格→排序→重新拼接 df['skill_group'] = df['skill.set'].apply( lambda x: ','.join(sorted([s.strip() for s in x.split(',')])) ) # 按分组取lift最大的记录(用idxmax获取每组最大值的索引,再筛选原数据) result_df = df.loc[df.groupby('skill_group')['lift'].idxmax()] # 可选:删除临时的分组列 result_df = result_df.drop('skill_group', axis=1) print(result_df)
运行后会得到:
lift skill.set 1 4.5 PowerPoint, Excel 3 5.1 SQL, Python
进阶优化:处理大小写/空格问题
如果你的技能字符串存在大小写不一致(比如"excel"和"Excel")或者多余空格,可以在处理时统一标准化:
df['skill_group'] = df['skill.set'].apply( lambda x: ','.join(sorted([s.strip().lower() for s in x.split(',')])) )
方法二:哈希值分组(性能更优)
如果你的数据集特别大(百万级以上),可以用哈希值替代标准化字符串,减少内存占用并提升分组速度:
# 生成技能集合的哈希值(排序后的元组可哈希) df['skill_hash'] = df['skill.set'].apply( lambda x: hash(tuple(sorted([s.strip() for s in x.split(',')]))) ) # 按哈希值分组取最大值 result_df = df.loc[df.groupby('skill_hash')['lift'].idxmax()] result_df = result_df.drop('skill_hash', axis=1)
哈希值是整数,运算速度比字符串更快,但可读性差,适合追求性能的场景。
为什么比朴素方法高效?
- 避免了手动循环和向量转换的冗余操作,pandas内置的
groupby和idxmax都是经过C优化的函数,性能远高于纯Python循环; - 标准化分组的逻辑只需要一次遍历即可完成,时间复杂度是O(n log k)(k是每条记录的技能数量),非常高效。
内容的提问来源于stack exchange,提问作者Kevin Sun
相关产品推荐
相关产品推荐

