首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用AND或or选项在多列数据框中搜索多个字符串

使用AND或or选项在多列数据框中搜索多个字符串
EN

Stack Overflow用户
提问于 2020-07-26 08:40:27
回答 2查看 48关注 0票数 2

我可以在每一列中进行单个单词搜索,但无法使用"and“"or”选项搜索用户提供的数量的字符串搜索

代码语言:javascript
运行
复制
   0     1    3   4     
0 [OH-] [Na+] NAN CCO 
                                              
1 [OH-] [Na+] CCO  Cl  

这个可以用

代码语言:javascript
运行
复制
search = 'CCO' 
df.loc[df.isin([search]).any(axis=1)].index.tolist()

对于多个搜索,我尝试过

代码语言:javascript
运行
复制
import re

terms = ['C1', 'CCO']
p = r'\b(?:{})\b'.format('|'.join(map(re.escape, terms)))
df[df['col'].str.contains(p)]

给了我KeyError: 'col'

预期输出

代码语言:javascript
运行
复制
Search='C1' AND '[NA+]

结果1

代码语言:javascript
运行
复制
Search='CCO' OR 'C1'

结果0 1

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-07-26 09:53:38

我这样创建了你的数据帧:

代码语言:javascript
运行
复制
df = pd.DataFrame( { 0 : ["[OH-]","[Na+]","NAN","CCO" ], 1 :  ["[OH-]","[Na+]","CCO","Cl"] } ).transpose()

生成此df:

代码语言:javascript
运行
复制
       0      1    2    3
0  [OH-]  [Na+]  NAN  CCO
1  [OH-]  [Na+]  CCO   Cl

我观察到,您可以在df上使用isin()函数执行OR逻辑:

代码语言:javascript
运行
复制
df.isin(['CCO','C1'])

收益率:

代码语言:javascript
运行
复制
       0      1      2      3
0  False  False  False   True
1  False  False   True  False

因此,您可以在使用以下命令时使用any(1)找出哪些行匹配:

代码语言:javascript
运行
复制
df.isin(['CCO','C1']).any(1).index.tolist()

收益率:

代码语言:javascript
运行
复制
[0, 1]

AND逻辑:

下面的代码片段分别查找每个术语,并将它们累积到结果数据帧中。在找到匹配的列之后,检查每一行中的匹配数量,以查看它是否与术语的数量相匹配。

代码语言:javascript
运行
复制
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]

票数 1
EN

Stack Overflow用户

发布于 2020-07-26 09:40:48

因为没有列名为col。试试这个:

代码语言:javascript
运行
复制
df[df.apply(lambda col: col.str.contains(p)).any(axis=1)]

col现在是lambda的输入参数的名称。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63094989

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档