Python 在列表中的列中查找关键字匹配数
我有一个熊猫数据框,如下所示:Python 在列表中的列中查找关键字匹配数,python,python-3.x,pandas,nlp,nltk,Python,Python 3.x,Pandas,Nlp,Nltk,我有一个熊猫数据框,如下所示: 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, Raccoo
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]
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
假设我有以下字符串:
input = "There is a dead rat and raccoon in my pool"
假设我将字符串标记化并删除停止字,使其成为
input = [Dead, Rat, Raccoon, Pool]
我需要遍历每一行,找到关键字匹配数最高的行。对于给定的示例,结果如下所示:
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]
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函数,但据我所知,它们无法让我获得我想要的输出(如果我的假设不正确,我一点也不会感到惊讶)
接下来,我研究了集和hashmaps在pandas中的用法,但不幸的是,我的编码知识和当前的能力还不足以构建一个完整的解决方案。特别是让我更接近我想要的,尽管它没有找到前三名匹配行名称
我将非常感谢任何帮助或建议。您可以查看
isin
df['Matches']=pd.DataFrame(df.Keywords.values.tolist()).isin(s).sum(1)
df.loc[df['Matches']>0,'Type'].values.tolist()
在数据帧中存储和操作列表不是很有效,也就是说,我们可以在这里使用集合交集: 设置 现在使用列表理解(比应用更快):
一种简单的方法是使用应用和设置交叉点计数
out.loc[out.Matches.nlargest(3).index].Type.tolist()
['Pest', 'Animal', 'Predator']