Python 如果(微笑)字符串中的字母不是元素列表中的字母,则筛选行
问题 如果字符串中的任何字母(原子)对大写字母不敏感,来自元素的数据帧Python 如果(微笑)字符串中的字母不是元素列表中的字母,则筛选行,python,python-3.x,jupyter-notebook,bioinformatics,Python,Python 3.x,Jupyter Notebook,Bioinformatics,问题 如果字符串中的任何字母(原子)对大写字母不敏感,来自元素的数据帧H、He、Li、Be、B,如何过滤掉SMILES字符串?这是一个被截断的列表,其中有80个 背景 我有一个包含字符串的数据库: 简化分子输入行输入系统(SMILES)是一种线符号形式的规范,用于使用短ASCII字符串描述化学物种的结构 (更多信息) 其目的是从数据库中去除稀有元素和有机金属 我从一个字符串开始,在进入数据帧之前测试代码。我编写循环来测试字符串中的字符 strings = "[O+]#C[Ni-4](C
H、He、Li、Be、B
,如何过滤掉SMILES字符串?这是一个被截断的列表,其中有80个
背景
我有一个包含字符串的数据库:
简化分子输入行输入系统(SMILES)是一种线符号形式的规范,用于使用短ASCII字符串描述化学物种的结构
(更多信息)
其目的是从数据库中去除稀有元素和有机金属
我从一个字符串开始,在进入数据帧之前测试代码。我编写循环来测试字符串中的字符
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
实际上是指简单芳环上的硫和碳,而不是钪Sc
。因此,我们需要一种方法来识别Sc
,并且只在没有附加数字的情况下识别消极前瞻将在这里帮助我们
df['Sc'] = df['smiles'].str.match('Sc(?!\d)')
那么你的问题是什么?您从程序中获得了哪种输出?如果您检查
i
包含的内容,您会发现您的方法有问题:for i in strings
一次只获取一个字符。@usr2564301谢谢!我根据你的提示写了一个答案