以下代码运行后得到的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()
时间: 2024-04-11 14:26:36 浏览: 202
ICNT7152L_Datasheet_EN_V1.0_20160829
问题出在最后一行代码`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库,并确保你的数据集使用了正确的列名。
阅读全文