# 转换SMILES为分子指纹 smiles = data['SMILES'] fps = [] for smi in smiles: mol = Chem.MolFromSmiles(smi) fp = rdFingerprintGenerator.GetCountFPs([mol])[0] fps.append(fp.ToBitString())
时间: 2024-04-11 09:26:22 浏览: 217
你可以使用RDKit库来将SMILES转换为分子指纹。以下是一个示例代码:
```python
from rdkit import Chem
from rdkit.Chem import rdFingerprintGenerator
smiles = data['SMILES']
fps = []
for smi in smiles:
mol = Chem.MolFromSmiles(smi)
fp = rdFingerprintGenerator.GetCountFPs([mol])[0]
fps.append(fp.ToBitString())
```
在这个代码中,你首先从RDKit库中导入所需的模块,然后创建一个空的列表`fps`来存储分子指纹。接下来,你遍历每个SMILES字符串,使用`Chem.MolFromSmiles()`函数将其转换为RDKit的分子对象。然后,使用`rdFingerprintGenerator.GetCountFPs()`函数计算分子的指纹,并将其添加到`fps`列表中。最后,你可以使用`fp.ToBitString()`将指纹转换为字符串形式并存储在`fps`列表中。
请注意,这只是一个示例代码,你可能需要根据自己的需求进行适当的修改。
相关问题
以下代码报错'UIntSparseIntVect' object has no attribute 'ToBitString',是为什么呢? smiles = data['SMILES'] fps = [] for smi in smiles: mol = Chem.MolFromSmiles(smi) fp = rdFingerprintGenerator.GetCountFPs([mol])[0] fps.append(fp.ToBitString())
这个错误通常发生在RDKit库的旧版本中。在较新的版本中,`UIntSparseIntVect`对象没有`ToBitString()`方法。相反,你可以使用`ToBitVect()`方法将其转换为位向量(bit vector)对象,然后再使用`ToBitString()`方法将其转换为字符串形式。
以下是修正后的代码:
```python
from rdkit import Chem
from rdkit.Chem import rdFingerprintGenerator
smiles = data['SMILES']
fps = []
for smi in smiles:
mol = Chem.MolFromSmiles(smi)
fp = rdFingerprintGenerator.GetCountFPs([mol])[0]
bitvect = fp.ToBitVect()
bitstring = bitvect.ToBitString()
fps.append(bitstring)
```
在这个修正后的代码中,我们首先将分子指纹计算为`UIntSparseIntVect`对象,然后使用`ToBitVect()`方法将其转换为位向量(bit vector)。接下来,我们使用`ToBitString()`方法将位向量转换为字符串形式,并将其添加到`fps`列表中。
请确保你使用的是RDKit库的最新版本,以避免此错误。
以下代码运行后得到的data['Fingerprint']使用data.info()查看还是object而非float64,这是为什么呢?到底该如何解决 smiles = data['SMILES'] # 创建一个空的列表来存储分子指纹 fps = [] # 遍历每个SMILES,计算Morgan指纹并添加到列表中 for smi in smiles: mol = Chem.MolFromSmiles(smi) fp = AllChem.GetMorganFingerprintAsBitVect(mol, 2) # 这里使用默认的Morgan指纹参数 fps.append(fp.ToBitString())# 将分子指纹转换为数值数组 fps_array = np.array([list(fp) for fp in fps], dtype=int)# 将分子指纹加入数据集 data['Fingerprint'] = fps_array.tolist()
问题出在最后一行代码`data['Fingerprint'] = fps_array.tolist()`上。在这行代码中,你将`fps_array`转换为列表并赋值给了`data['Fingerprint']`,因此`data['Fingerprint']`的数据类型变为了object而非float64。
要解决这个问题,你可以使用`pd.Series()`函数来创建一个新的Series对象,并将其赋值给`data['Fingerprint']`,而无需将`fps_array`转换为列表。这样可以保持数据类型为float64。
以下是修正后的代码:
```python
import pandas as pd
import numpy as np
from rdkit import Chem
from rdkit.Chem import AllChem
smiles = data['SMILES']
fps = []
for smi in smiles:
mol = Chem.MolFromSmiles(smi)
fp = AllChem.GetMorganFingerprintAsBitVect(mol, 2)
fps.append(fp.ToBitString())
fps_array = np.array([list(fp) for fp in fps], dtype=int)
data['Fingerprint'] = pd.Series(fps_array.tolist(), dtype=np.float64)
```
在这个修正后的代码中,我们使用`pd.Series()`函数来创建一个新的Series对象,并将其赋值给`data['Fingerprint']`。由于我们指定了数据类型为np.float64,因此`data['Fingerprint']`的数据类型将保持为float64。
请注意,你需要先导入pandas库,并确保你的数据集使用了正确的列名。
阅读全文