问题描述
问题
如果字符串不区分大小写中的任何字母(原子)来自元素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