可以直接将存储在 pandas 数据帧中的 SMILE 结构输入 RDKit 以计算分子指纹和相似度吗?
Possible to directly feed SMILE structures stored in a pandas dataframe into RDKit to calculate molecular fingerprint and similarity?
ref_Molecule = Chem.MolFromSmiles('CC1=C(C(O)=O)C2=CC(=CC=C2N=C1C3=CC=C(C=C3)C4=CC=CC=C4F)F')
merged_data['Molecule_Tan'] = DataStructs.TanimotoSimilarity(Chem.RDKFingerprint(ref_Brequinar), Chem.RDKFingerprint(Chem.MolFromSmiles(merged_data.SMILES)))
我的 df 中存储了大约 1500 个 SMILES 结构,merged_data['SMILES']。
我正在尝试创建一个名为 'Molecule_Tan' 的 merged_data 的新列,我想用数据框微笑的 Tanimoto 相似性指数填充存储在 [=14] 中的参考序列=].
我尝试通过使用 merged_data.SMILES
或 merged_data['SMILES']
将 SMILE 值直接从数据帧直接传递到嵌套的 RDKit 函数来提高效率,但是当我尝试 运行 这我得到这个错误..
Traceback (most recent call last):
File "filepath", line 69, in <module>
strasd = Chem.MolFromSmiles(merged_data['SMILES'].astype('object'))
TypeError: No registered converter was able to produce a C++ rvalue of type class std::basic_string<wchar_t,struct std::char_traits<wchar_t>,class std::allocator<wchar_t> > from this Python object of type Series
如果我尝试仅提供 Chem.MolFromSmiles() 数据框,也会发生此错误。
虽然我不是 100% 清楚,但我 认为 这个错误与 pandas 数据框有关,试图给 MolFromSmiles() 函数一个系列而不是单个对象。
我想弄清楚的是,是否有一种方法可以管理我在 pandas 内尝试做的事情,而无需编写循环来遍历整个数据框架.
感谢任何可以就我正在尝试做的事情是否可行提供意见的人!!!
==============
如果有帮助的话,我的数据框的重要部分大概是这样的...
Title ... SMILES
0 236254 ... Cc1c(-c2ccccc2)n(O)[n+]([O-])c1-c1ccccc1
1 79582 ... [O-][n+]1nc2ccccc2c2ccccc21
2 26744 ... O=c1cc(-c2ccccc2)oc2ccc(O)cc12
3 38007 ... Oc1cc(-c2ccc(Cl)cc2)nc2ccccc12
4 109747 ... Cc1cc(O)c2cc(C(=O)c3ccccc3)ccc2n1
.. ... ... ...
你是对的,pandas给出了整个系列而不是单个对象,所以你必须迭代。
但随后可以立即将指纹与 BulkTanimotoSimilarity()
进行比较。
您可以试试这个代码:
from rdkit import Chem
from rdkit import DataStructs
import pandas as pd
target = Chem.RDKFingerprint(Chem.MolFromSmiles('CC1=C(C(O)=O)C2=CC(=CC=C2N=C1C3=CC=C(C=C3)C4=CC=CC=C4F)F'))
d = {'SMILES': ['Cc1c(-c2ccccc2)n(O)[n+]([O-])c1-c1ccccc1',
'[O-][n+]1nc2ccccc2c2ccccc21',
'O=c1cc(-c2ccccc2)oc2ccc(O)cc12',
'Oc1cc(-c2ccc(Cl)cc2)nc2ccccc12',
'Cc1cc(O)c2cc(C(=O)c3ccccc3)ccc2n1']}
df = pd.DataFrame(data=d)
df['Tanimoto'] = DataStructs.BulkTanimotoSimilarity(target, [Chem.RDKFingerprint(Chem.MolFromSmiles(s)) for s in df['SMILES']])
print(df)
输出:
SMILES Tanimoto
0 Cc1c(-c2ccccc2)n(O)[n+]([O-])c1-c1ccccc1 0.287625
1 [O-][n+]1nc2ccccc2c2ccccc21 0.178967
2 O=c1cc(-c2ccccc2)oc2ccc(O)cc12 0.273179
3 Oc1cc(-c2ccc(Cl)cc2)nc2ccccc12 0.387127
4 Cc1cc(O)c2cc(C(=O)c3ccccc3)ccc2n1 0.319298
ref_Molecule = Chem.MolFromSmiles('CC1=C(C(O)=O)C2=CC(=CC=C2N=C1C3=CC=C(C=C3)C4=CC=CC=C4F)F')
merged_data['Molecule_Tan'] = DataStructs.TanimotoSimilarity(Chem.RDKFingerprint(ref_Brequinar), Chem.RDKFingerprint(Chem.MolFromSmiles(merged_data.SMILES)))
我的 df 中存储了大约 1500 个 SMILES 结构,merged_data['SMILES']。
我正在尝试创建一个名为 'Molecule_Tan' 的 merged_data 的新列,我想用数据框微笑的 Tanimoto 相似性指数填充存储在 [=14] 中的参考序列=].
我尝试通过使用 merged_data.SMILES
或 merged_data['SMILES']
将 SMILE 值直接从数据帧直接传递到嵌套的 RDKit 函数来提高效率,但是当我尝试 运行 这我得到这个错误..
Traceback (most recent call last):
File "filepath", line 69, in <module>
strasd = Chem.MolFromSmiles(merged_data['SMILES'].astype('object'))
TypeError: No registered converter was able to produce a C++ rvalue of type class std::basic_string<wchar_t,struct std::char_traits<wchar_t>,class std::allocator<wchar_t> > from this Python object of type Series
如果我尝试仅提供 Chem.MolFromSmiles() 数据框,也会发生此错误。
虽然我不是 100% 清楚,但我 认为 这个错误与 pandas 数据框有关,试图给 MolFromSmiles() 函数一个系列而不是单个对象。
我想弄清楚的是,是否有一种方法可以管理我在 pandas 内尝试做的事情,而无需编写循环来遍历整个数据框架.
感谢任何可以就我正在尝试做的事情是否可行提供意见的人!!!
==============
如果有帮助的话,我的数据框的重要部分大概是这样的...
Title ... SMILES
0 236254 ... Cc1c(-c2ccccc2)n(O)[n+]([O-])c1-c1ccccc1
1 79582 ... [O-][n+]1nc2ccccc2c2ccccc21
2 26744 ... O=c1cc(-c2ccccc2)oc2ccc(O)cc12
3 38007 ... Oc1cc(-c2ccc(Cl)cc2)nc2ccccc12
4 109747 ... Cc1cc(O)c2cc(C(=O)c3ccccc3)ccc2n1
.. ... ... ...
你是对的,pandas给出了整个系列而不是单个对象,所以你必须迭代。
但随后可以立即将指纹与 BulkTanimotoSimilarity()
进行比较。
您可以试试这个代码:
from rdkit import Chem
from rdkit import DataStructs
import pandas as pd
target = Chem.RDKFingerprint(Chem.MolFromSmiles('CC1=C(C(O)=O)C2=CC(=CC=C2N=C1C3=CC=C(C=C3)C4=CC=CC=C4F)F'))
d = {'SMILES': ['Cc1c(-c2ccccc2)n(O)[n+]([O-])c1-c1ccccc1',
'[O-][n+]1nc2ccccc2c2ccccc21',
'O=c1cc(-c2ccccc2)oc2ccc(O)cc12',
'Oc1cc(-c2ccc(Cl)cc2)nc2ccccc12',
'Cc1cc(O)c2cc(C(=O)c3ccccc3)ccc2n1']}
df = pd.DataFrame(data=d)
df['Tanimoto'] = DataStructs.BulkTanimotoSimilarity(target, [Chem.RDKFingerprint(Chem.MolFromSmiles(s)) for s in df['SMILES']])
print(df)
输出:
SMILES Tanimoto
0 Cc1c(-c2ccccc2)n(O)[n+]([O-])c1-c1ccccc1 0.287625
1 [O-][n+]1nc2ccccc2c2ccccc21 0.178967
2 O=c1cc(-c2ccccc2)oc2ccc(O)cc12 0.273179
3 Oc1cc(-c2ccc(Cl)cc2)nc2ccccc12 0.387127
4 Cc1cc(O)c2cc(C(=O)c3ccccc3)ccc2n1 0.319298