在pandas数据框中,求Col A和Col B的差值

3

我有一个数据框中的两个字符串列,我想从A中减去B中的公共单词。

A ->  Stack Overlflow is great            


B -> stack great


A-B -> overflow is

我尝试了以下代码。但只有当B列只有一个单词时才有效。
df['A-B'] = [' '.join(set(a.split())-set(b.split())) for a, b in zip(df['A'], df['B'])]

有什么更改可以让B有多个单词时也能正常工作?
3个回答

2
你可以使用 np.setdiff1d()
df['A-B']=df.apply(lambda x: ' '.join(np.setdiff1d(x['A'].lower().split(),
                                        x['B'].lower().split())),axis=1)
print(df)

                          A            B           A-B
0  Stack Overlflow is great  stack great  is overlflow

你的解决方案已经接近成功了,只需要在将它们压缩时添加 series.str.lower() 即可:
df['A-B']=[' '.join(set(a.split())-set(b.split())) 
        for a, b in zip(df['A'].str.lower(), df['B'].str.lower())]

如果该系列具有重复的字符串,请使用OrderedDict来帮助去除重复项,类似于set(),但仍保持顺序:
df = pd.DataFrame({'A': ['Stack Overlflow is great is great'], 'B': ['stack great']})
                                  A            B
0  Stack Overlflow is great is great  stack great

from collections import OrderedDict
df['A-B']=[' '.join([ele for ele in OrderedDict.fromkeys(a) if ele not in b ])
 for a,b in zip(df.A.str.lower().str.split(),df.B.str.lower().str.split())]
print(df)

                                   A            B           A-B
0  Stack Overlflow is great is great  stack great  overlflow is

1
谢谢介绍setdiff1d,我正在阅读它:)。它没有提到排序。它是否保留原始顺序? - Erfan
1
我会的,谢谢。知道这点很好,因为大多数人会使用“set”来实现,但是那样做无法保持原始顺序,所以这实际上是一个很好的替代方法。 - Erfan
1
@Erfan,它的意思是:“当assume_unique=False时,结果被排序,但如果输入未排序,则仅在输入已排序时进行排序。” :) - anky

2

示例df如下:

>>> df = pd.DataFrame({'A': ['Stack Overlflow is great'], 'B': ['stack great']})

您可以使用apply

原始答案翻译成:最初的回答

>>> df['A-B'] = df.apply(lambda x: ' '.join([i for i in x[0].split() if i.lower() not in x[1].split()]), axis=1)
>>> df
                          A            B           A-B
0  Stack Overlflow is great  stack great  Overlflow is
>>> 

0

试试这个一行代码:

' '.join(list(set(list(df.A.str.lower().str.split(' '))[0])-set(list(df.B.str.lower().str.split(' '))[0])))

将两列值都转换为小写,通过空格分割并放入列表中,然后取这些列表的集合并用空格连接它们。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接