我可以在每一列中进行单个单词搜索,但无法使用"and“"or”选项搜索用户提供的数量的字符串搜索
0 1 3 4
0 [OH-] [Na+] NAN CCO
1 [OH-] [Na+] CCO Cl 这个可以用
search = 'CCO'
df.loc[df.isin([search]).any(axis=1)].index.tolist()对于多个搜索,我尝试过
import re
terms = ['C1', 'CCO']
p = r'\b(?:{})\b'.format('|'.join(map(re.escape, terms)))
df[df['col'].str.contains(p)]给了我KeyError: 'col'
预期输出
Search='C1' AND '[NA+]结果1
Search='CCO' OR 'C1'结果0 1
发布于 2020-07-26 09:53:38
我这样创建了你的数据帧:
df = pd.DataFrame( { 0 : ["[OH-]","[Na+]","NAN","CCO" ], 1 : ["[OH-]","[Na+]","CCO","Cl"] } ).transpose()生成此df:
0 1 2 3
0 [OH-] [Na+] NAN CCO
1 [OH-] [Na+] CCO Cl我观察到,您可以在df上使用isin()函数执行OR逻辑:
df.isin(['CCO','C1'])收益率:
0 1 2 3
0 False False False True
1 False False True False因此,您可以在使用以下命令时使用any(1)找出哪些行匹配:
df.isin(['CCO','C1']).any(1).index.tolist()收益率:
[0, 1]AND逻辑:
下面的代码片段分别查找每个术语,并将它们累积到结果数据帧中。在找到匹配的列之后,检查每一行中的匹配数量,以查看它是否与术语的数量相匹配。
results = pd.DataFrame()
terms = [ 'Cl', '[Na+]' ]
for term in terms:
if results.empty:
results = df.isin( [ term ] )
else:
results |= df.isin( [ term ] )
results['count'] = results.sum(axis=1)
print( results[ results['count'] == len( terms ) ].index.tolist() ) 我知道有一种更好的方法--但这种方法(我认为)行得通
上面的代码为terms = [ 'Cl', '[Na+]' ]生成[1],为terms = [ "[OH-]","[Na+]" ]生成[0,1]。
发布于 2020-07-26 09:40:48
因为没有列名为col。试试这个:
df[df.apply(lambda col: col.str.contains(p)).any(axis=1)]col现在是lambda的输入参数的名称。
https://stackoverflow.com/questions/63094989
复制相似问题