【问题标题】:Multi String search in Data frame in Multiple column with AND or OR Option使用 AND 或 OR 选项在多列中的数据框中搜索多字符串
【发布时间】:2020-11-15 14:00:52
【问题描述】:

我可以在每列中进行单个单词搜索,但无法使用“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

【问题讨论】:

  • 请发布您的预期输出

标签: python pandas search


【解决方案1】:

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

df[df.apply(lambda col: col.str.contains(p)).any(axis=1)]

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

【讨论】:

    【解决方案2】:

    我以这种方式创建了您的数据框:

    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 逻辑:

    下面的 sn-p 单独查找每个术语并将它们累积在结果数据框中。找到匹配的列后,检查每行的匹配数,看是否与词数匹配。

    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]

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-03
      • 1970-01-01
      • 1970-01-01
      • 2019-12-18
      • 2020-07-20
      • 2016-08-19
      • 1970-01-01
      相关资源
      最近更新 更多