You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 04:05:32