| ID| ab_keywords| bc_keywords|
| - -----|- -----|- -----|
| ABL345|锐龙,锐龙7 x,锐龙5800,锐龙7 x| Ryzen,Ryzen 71x,Ryzen 5900,best|
| ABL448| Ryzen 5800 7x,Ryzen 8x,cpu,Ryzen 5800| Ryzen 5900 71 x,Ryzen 8x,处理器,最佳|
这是一个表,我想识别并删除bc_keywords中存在的重复值, 如果这些值已经存在于列中:ab_keywords
例如:“ryzen”存在于ID的两列中:ABL 345,所以我想识别它并将其从bc_keywords中删除
所以我期望的表看起来像这样:
| ID| ab_keywords| bc_keywords|双曲|bc_new|
| - -----|- -----|- -----|- -----|- -----|
| ABL345|锐龙,锐龙7 x,锐龙5800,锐龙7 x| Ryzen,Ryzen 71x,Ryzen 5900,best|雷曾|ryzen 71x,ryzen 5900,best|
| ABL448| Ryzen 5800 7x,Ryzen 8x,cpu,Ryzen 5800| Ryzen 5900 71 x,Ryzen 8x,处理器,最佳|Ryzen 8x| Ryzen 5900 71 x,处理器,最佳|
有什么办法可以让我做吗?
列“duplis”也不是很需要,我的主要目标是删除duplis和添加新的关键字列表在一个新的列。
我试过使用df.duplicated(),但肯定像我做错了什么,并没有得到我正在寻找的答案
duplicated()只是给了我一个布尔序列列
我也尝试了以下方法:
dof['new'] = list(set(dof['bc']) - set(dof['ab']))
dof['new']
dof.head()
但是输出看起来很奇怪:
| ID| ab_keywords| bc_keywords| bc_new|
| - -----|- -----|- -----|- -----|
| ABL345|锐龙,锐龙7 x,锐龙5800,锐龙7 x| Ryzen,Ryzen 71x,Ryzen 5900,best| Ryzen 5900 71 x,Ryzen 8x,处理器,最佳|
| ABL448| Ryzen 5800 7x,Ryzen 8x,cpu,Ryzen 5800| Ryzen 5900 71 x,Ryzen 8x,处理器,最佳|Ryzen,Ryzen 71x,Ryzen 5900,best|
3条答案
按热度按时间jgwigjjp1#
尝试:
1.按“,”拆分
bc_keywords
列explode
列,每个关键字得到一行1.识别重复项
groupby
和agg
-根据需要注册| ID| ab_keywords| bc_keywords|双曲|bc_new|
| - -----|- -----|- -----|- -----|- -----|
| ABL345|锐龙,锐龙7 x,锐龙5800,锐龙7 x| Ryzen,Ryzen 71x,Ryzen 5900,best|雷曾|ryzen 71x,ryzen 5900,best|
| ABL448| Ryzen 5800 7x,Ryzen 8x,cpu,Ryzen 5800| Ryzen 5900 71 x,Ryzen 8x,处理器,最佳|Ryzen 8x| Ryzen 5900 71 x,处理器,最佳|
ugmeyewa2#
一个可能的解决方案是使用 helper func 来
dedup
由split
构成的关键字:输出:
| ID| ab_keywords| bc_keywords|双曲|新bc|
| - -----|- -----|- -----|- -----|- -----|
| ABL345|锐龙,锐龙7 x,锐龙5800,锐龙7 x| Ryzen,Ryzen 71x,Ryzen 5900,best|雷曾|ryzen 71x,ryzen 5900,best|
| ABL448| Ryzen 5800 7x,Ryzen 8x,cpu,Ryzen 5800| Ryzen 5900 71 x,Ryzen 8x,处理器,最佳|Ryzen 8x| Ryzen 5900 71 x,处理器,最佳|
yshpjwxd3#
您应该将此逻辑应用于 Dataframe 中的每一行。
我根据你的例子创建了一个模拟数据集:
然后准备一个函数应用于每一行:
输出:
如果值存储为字符串而不是列表,则在应用函数之前或在函数内部也应该将它们拆分为列表。
编辑:我更新了代码,将值作为字符串处理-添加了将它们首先拆分为列表。