查询数据帧中的关键字并返回匹配的行

问题描述

我有以下数据框:

-replace

给出一个关键字,例如'blue',我想检索以下行:

pd.DataFrame({
    'Code': ['XAW','PAK','I','QP','TOPZ','XAW','APOL'],'Name': ['George Truck','Fred Williams','Jessica Weir','Tony P.','John Truck','Liz Moama','Emily Truck'],'Color': ['Blue','Green','Red','Pink','Blue','Pink']
})


    Code    Name           Color
0   XAW     George Truck   Blue
1   PAK     Fred Williams  Green
2   I       Jessica Weir   Green
3   QP      Tony P.        Red
4   TOPZ    John Truck     Pink
5   XAW     Liz Moama      Blue
6   APOL    Emily Truck    Pink

搜索可以包含多个关键字,例如,“ truck pink”将返回:

0   XAW     George Paul    Blue
5   XAW     Liz Moama      Blue

想象一下,这个数据框有500万行和一些额外的列。是否可以快速查询整个数据帧中的特定关键字?

解决方法

使用搜索字符串s = 'truck pink',设置搜索列:

t = (df['Name'] + ' ' + df['Color']).str.lower()

我将所有内容都强制小写,因为您的搜索示例似乎不区分大小写。如果您有动态搜索输入,还可以强制搜索字段为小写。然后像这样搜索包含的内容:

d = {}
for i in s.split(' '):
    d[i] = t.str.contains(i,na=False)

我通过na=False是因为否则,在字符串列本身为NA的情况下,Pandas将填充NA。我们不希望这种行为。操作的复杂度随着搜索词的数量而迅速增加。如果您想匹配整个单词,也请考虑更改此功能,因为contains匹配子字符串。

无论如何,获取结果并按位“与”将其减少。您需要两次导入:

from functools import reduce
from operator import and_

df[reduce(and_,d.values())]

因此:

   Code         Name Color
4  TOPZ   John Truck  Pink
6  APOL  Emily Truck  Pink