如何从bc_keywords列移除与ab_keywords列重复的关键词?
问题描述
现有如下数据表:
| ID | ab_keywords | bc_keywords |
|---|---|---|
| ABL345 | ryzen,ryzen 7x,ryzen 5800,ryzen 7x | ryzen,ryzen 71x,ryzen 5900,best |
| ABL448 | ryzen 5800 7x,ryzen 8x,cpu,ryzen 5800 | ryzen 5900 71x,ryzen 8x,processor,best |
需求为移除bc_keywords列中已在ab_keywords列出现过的关键词,生成bc_new列(可选生成duplis列记录重复关键词),预期输出:
| ID | ab_keywords | bc_keywords | duplis | bc_new |
|---|---|---|---|---|
| ABL345 | ryzen,ryzen 7x,ryzen 5800,ryzen 7x | ryzen,ryzen 71x,ryzen 5900,best | ryzen | ryzen 71x,ryzen 5900,best |
| ABL448 | ryzen 5800 7x,ryzen 8x,cpu,ryzen 5800 | ryzen 5900 71x,ryzen 8x,processor,best | ryzen 8x | ryzen 5900 71x,processor,best |
此前尝试df.duplicated()仅得到布尔序列,未达需求;使用以下代码时输出混乱:
dof['new'] = list(set(dof['bc']) - set(dof['ab'])) dof['new'] dof.head()
错误原因
直接对整列执行集合运算会将所有行的关键词混在一起计算,而非按行单独处理,导致结果错乱。
解决方法
需按行逐条处理数据,步骤如下:
- 将每行的关键词字符串按逗号分割为列表;
- 提取
ab_keywords的关键词集合(用于快速查重); - 筛选出
bc_keywords中的重复关键词和剩余关键词; - 将结果拼接回逗号分隔的字符串,生成目标列。
代码实现
import pandas as pd # 构造原始数据 data = { 'ID': ['ABL345', 'ABL448'], 'ab_keywords': ['ryzen,ryzen 7x,ryzen 5800,ryzen 7x', 'ryzen 5800 7x,ryzen 8x,cpu,ryzen 5800'], 'bc_keywords': ['ryzen,ryzen 71x,ryzen 5900,best', 'ryzen 5900 71x,ryzen 8x,processor,best'] } df = pd.DataFrame(data) def process_single_row(row): # 分割关键词为列表,将ab关键词转成集合(提升查重效率) ab_keywords_set = set(row['ab_keywords'].split(',')) bc_keywords_list = row['bc_keywords'].split(',') # 筛选重复关键词和剩余关键词,保留原顺序 duplicate_keywords = [kw for kw in bc_keywords_list if kw in ab_keywords_set] filtered_bc_keywords = [kw for kw in bc_keywords_list if kw not in ab_keywords_set] return pd.Series({ 'duplis': ','.join(duplicate_keywords), 'bc_new': ','.join(filtered_bc_keywords) }) # 按行应用处理函数,合并结果到原数据表 result_df = df.join(df.apply(process_single_row, axis=1)) print(result_df)
运行结果
ID ab_keywords bc_keywords duplis bc_new 0 ABL345 ryzen,ryzen 7x,ryzen 5800,ryzen 7x ryzen,ryzen 71x,ryzen 5900,best ryzen ryzen 71x,ryzen 5900,best 1 ABL448 ryzen 5800 7x,ryzen 8x,cpu,ryzen 5800 ryzen 5900 71x,ryzen 8x,processor,best ryzen 8x ryzen 5900 71x,processor,best
内容的提问来源于stack exchange,提问作者Popeye
相关产品推荐
相关产品推荐

