问题描述
我有以下数据框:
-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