如何解决如果来自微笑字符串而不是元素列表的字母,则过滤行
问题
如果字符串不区分大小写中的任何字母(原子)来自元素H,He,Li,Be,B
的数据帧,如何过滤SMILES字符串?这是一个截断的列表,其中有80个。
背景
简化的分子输入行输入系统(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
时,这将是有问题的,其中S
和c
实际上是指简单的芳香环上的硫和碳,而不是Scan {{1 }}。因此,我们需要一种仅在没有附加数字的情况下仅识别Sc
的方法。 提前否定将在此处为我们提供帮助。
Sc
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。