如果来自微笑字符串而不是元素列表的字母,则过滤行

问题描述

问题

如果字符串不区分大小写中的任何字母(原子)来自元素H,He,Li,Be,B的数据帧,如何过滤SMILES字符串?这是一个截断的列表,其中有80个。

背景

我有一个包含SMILES字符串的数据库

简化的分子输入行输入系统(SMILES)是行符号形式的规范,用于描述使用短ASCII字符串的化学物质的结构。

(更多信息Wikipedia link

这样做的目的是从数据库中消除稀有元素和有机金属。

我先从字符串开始测试代码,然后再处理数据帧。我编写循环以测试字符串中的字符。

strings = "[O+]#C[Ni-4](C#[O+])(C#[O+])C#[O+]"
list = ['Ni']
for i in list:
    if i in strings:
        print(i)

如何遍历数据框并进行过滤?

解决方法

对于列表/简化版本,执行相反的操作即可。使用列表查找字符串中的匹配项。

strings = "[O+]#C[Ni-4](C#[O+])(C#[O+])C#[O+]"
list = ['Ni','Sc']

for i in list:
    if i in strings:
        print(i)
else:
    print('nah')

> Ni
> nah

要遍历数据框,请使用np.where

df = pd.DataFrame({'smiles': ['sdflk','[O+]#C[Ni-4](C#[O+])(C#[O+])C#[O+]']})
list = ['Ni','Sc']

df['element'] = np.where(df.smiles.str.contains('|'.join(list)),1,0) # mark element that contains string in the list as 1,else 0
df[df['element'] == 1] # remove rows that have the element

请注意,当数据框包含类似字符串的Sc1时,这将是有问题的,其中Sc实际上是指简单的芳香环上的硫和碳,而不是Scan {{1 }}。因此,我们需要一种仅在没有附加数字的情况下仅识别Sc的方法。 提前否定将在此处为我们提供帮助。

Sc