根据同一行中单词的存在情况,查找两列是否匹配

时间:2018-06-27 00:07:21

标签: python pandas dataframe

我有一个有两列感兴趣的数据框。我想尝试按词比较两列,并找出是否有任何词重叠。如果是这样,我想附加一列以指示在行中找到了匹配的单词。

这是我的数据框示例:

df
    name1      name2
0   cat nip    giant cat
1   bad dog    blue sky
2   slow snail slimy snail
3   tall tree  big boy

这就是我想要的:

df
    name1      name2       found
0   cat nip    giant cat   True
1   bad dog    blue sky    False
2   slow snail slimy snail True
3   tall tree  big boy     False

我尝试了很多方法。一种方法是使用此代码:

df['found'] = df['name1'].apply(lambda x: any(i in df['name2'] for i in x))

哪个没用。第二种方法是使用此代码:

glossary = list(set(df['name1']))
pattern = '|'.join(glossary)
check = df[(df.name1.str.contains(pattern))& 
        (df.name2.str.contains(pattern))]

此代码也不起作用,它正在创建一个新的数据框(我不想要)。加上这两种方法都非常慢。有任何想法如何正确执行吗?

此外,我已经尝试过isin方法:

df['found'] = df['name1'].isin(df['name2'])

这也不起作用。它给了我许多错误的True标签。

2 个答案:

答案 0 :(得分:1)

您可以在系列之间使用&作为简单解决方案。

首先将您的列表transformset

transf_1 = df.name1.str.split(" ").transform(set)
transf_2 = df.name2.str.split(" ").transform(set)

然后

>>> transf_1 & transf_2.values

0     True
1    False
2     True
3    False

答案 1 :(得分:0)

或尝试以下操作:

df['found'] = [True if set(i['name1'].split()).intersection(i['name2'].split()) else False for idx,i in df.iterrows()]
print(df)

输出:

    name1      name2       found
0   cat nip    giant cat   True
1   bad dog    blue sky    False
2   slow snail slimy snail True
3   tall tree  big boy     False