我有一个有两列感兴趣的数据框。我想尝试按词比较两列,并找出是否有任何词重叠。如果是这样,我想附加一列以指示在行中找到了匹配的单词。
这是我的数据框示例:
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
标签。
答案 0 :(得分:1)
您可以在系列之间使用&
作为简单解决方案。
首先将您的列表transform
到set
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