以下代码运行后得到的data['Fingerprint']使用data.info()查看还是object而非float64,如何在一个含有多个特征的数据集中将特征SMLIES转化成分子指纹,转化后的分子指纹放入原来的数据集中能保证是数值而非object呢,每次用下述代码将SMILES转化成分子指纹后总是因为是object而无法用于XGBoost算法来建立模型 smiles = data 创建一个空的列表来存储分子指纹 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()
时间: 2024-04-11 14:26:45 浏览: 173
Automatic_Fingerprint_Authentication_System.zip_Cropping_64.m_ST
如果你想要将分子指纹转化为数值而非object,并将其添加到原始数据集中,你可以使用`pd.DataFrame()`来创建一个新的DataFrame对象,并将分子指纹作为一个新的列添加到该DataFrame中。然后,你可以使用`pd.concat()`函数将原始数据集和新的DataFrame对象合并起来。
以下是修改后的代码示例:
```python
import pandas as pd
import numpy as np
from rdkit import Chem
from rdkit.Chem import AllChem
# 假设data是一个包含多个特征的数据集,其中SMILES是需要转换为分子指纹的特征
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)
fps_df = pd.DataFrame(fps_array, columns=['Fingerprint'])
# 将分子指纹的DataFrame与原始数据集进行合并
data_with_fingerprint = pd.concat([data, fps_df], axis=1)
# 检查分子指纹列的数据类型
print(data_with_fingerprint['Fingerprint'].dtype)
```
在这个示例代码中,我们首先导入所需的库。然后,我们遍历每个SMILES字符串,计算Morgan指纹并将其添加到`fps`列表中,与之前的代码相同。接下来,我们将`fps`转换为一个包含分子指纹的NumPy数组`fps_array`。然后,我们使用`pd.DataFrame()`函数创建一个新的DataFrame对象`fps_df`,并将分子指纹数组作为一个新的列添加到该DataFrame中。
最后,我们使用`pd.concat()`函数将原始数据集`data`和包含分子指纹的DataFrame对象`fps_df`按列合并起来,得到一个包含分子指纹的新的数据集`data_with_fingerprint`。你可以使用`print()`语句来检查分子指纹列的数据类型。
请注意,这只是一个示例代码,你可能需要根据自己的数据集和需求进行适当的修改。
阅读全文