在lis中的pandas列中查找关键字匹配数

2024-05-13 06:14:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个pandas数据帧,如下所示:

Type        Keywords 
----        --------
Animal      [Pigeon, Bird, Raccoon, Dog, Cat]
Pet         [Dog, Cat, Hamster]
Pest        [Rat, Mouse, Raccoon, Pigeon]
Farm        [Chicken, Horse, Cow, Sheep]
Predator    [Wolf, Fox, Raccoon]

假设我有以下字符串:

^{pr2}$

假设我将字符串标记化并删除停止字,这样它就变成

input = [Dead, Rat, Raccoon, Pool]

我需要遍历每一行并找到关键字匹配数最多的行。对于给定的示例,结果如下所示:

Type        Keywords                            Matches
----        --------                            -------
Animal      [Pigeon, Bird, Raccoon, Dog, Cat]   1
Pet         [Dog, Cat, Hamster]                 0
Pest        [Rat, Mouse, Raccoon, Pigeon]       2
Farm        [Chicken, Horse, Cow, Sheep]        0
Predator    [Wolf, Fox, Raccoon]                1

输出将是匹配数最多的前三个类型名。在

在上面的情况下,由于“Pest”类别的匹配数最多,因此它将被选为最高匹配。此外,动物和捕食者的类别将被选择。因此,按顺序输出将是:

output = [Pest, Animal, Predator]

用嵌套的for循环来完成这项任务很容易,但是由于我有数千个这样的行,所以我在寻找更好的解决方案。(另外,由于某些原因,我在使用pandas的非内置函数时遇到了很多bug,可能是因为向量化?)在

我查看了pandas中内置的groupby和isin函数,但据我所知,它们无法让我获得我想要的输出(如果我的假设不正确,我一点也不会感到惊讶)。在

接下来,我研究了pandas的set和hashmap的用法,但不幸的是,我的编码知识和目前的能力还不足以熟练地制定一个可靠的解决方案。This StackOverflow link特别是让我更接近我想要的,尽管它没有找到前三个匹配的行名称。在

我将非常感谢任何帮助或建议。在


Tags: pandastypecatpetdograccoonkeywordspigeon
2条回答

您可以检查isin

df['Matches']=pd.DataFrame(df.Keywords.values.tolist()).isin(s).sum(1)


df.loc[df['Matches']>0,'Type'].values.tolist()

在数据帧中对列表进行存储和操作并不是很有效,也就是说,我们可以在这里使用set intersection:

设置

s = set(['Dead', 'Rat', 'Raccoon', 'Pool'])

现在使用列表理解(比apply更快):

^{pr2}$

要查找匹配最多的三行:

out.loc[out.Matches.nlargest(3).index].Type.tolist()

['Pest', 'Animal', 'Predator']

相关问题 更多 >