python - 可以直接将存储在 pandas 数据框中的 SMILE 结构输入 RDKit 来计算分子指纹和相似度吗?

标签 python pandas dataframe rdkit

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、merged_data['SMILES'] 中存储了大约 1500 个 SMILES 结构。

我正在尝试创建一个名为“Molecule_Tan”的新 merged_data 列,我想用数据帧 smiles 的 Tanimoto 相似度索引与存储在 ref_Molecule 中的引用序列进行填充。 .

我尝试通过使用merged_data.SMILES将SMILE值直接从数据帧传递到嵌套的RDKit函数中来提高效率。或merged_data['SMILES'] ,但是当我尝试运行它时,我收到此错误..

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

关于python - 可以直接将存储在 pandas 数据框中的 SMILE 结构输入 RDKit 来计算分子指纹和相似度吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66308319/

相关文章:

r - 计算几个列案例的出现次数

python - 将两个相关的 DataFrame 列拆分为两个新的 DataFrame

r - 如何将一个数据框变成多个数据框

python - joblib.load 和 pickle.load 错误 "No attribute ' XGBoostLabelEncoder'"

python - 如何在 debian wheezy 上安装 pypy

python - 如何在图表中绘制 pandas groupby 值

python - 如何使用条件语句创建包含计算值的新列

Python 返回数字列表的线性/累积对

python - 如何获取列表中所有 NaN 的所有索引?

python - Pandas iterrows 只给出最后一行的结果