从分子指纹CSV计算Tanimoto相似度遇参数错误求助
错误原因
你传入BulkTanimotoSimilarity的是pandas的Series和切片对象,而RDKit的该函数仅接受RDKit原生指纹对象(如SparseIntVect/ExplicitBitVect),且第二个参数要求是Python列表而非pandas结构。
修复方案
1. 将CSV数据转换为RDKit指纹对象
你的指纹包含非0/1数值(如示例中的3),属于计数型指纹,需转换为SparseIntVect对象:
import pandas as pd from rdkit.DataStructs import SparseIntVect # 读取CSV数据 input_data = pd.read_csv("file.csv", delimiter=',', header=None) # 批量转换为RDKit计数指纹 fp_list = [] for _, row in input_data.iterrows(): fp = SparseIntVect(2048) # 2048对应你的指纹位数 for bit_idx, count in enumerate(row): if count > 0: fp[bit_idx] = count fp_list.append(fp)
2. 修正Tanimoto距离计算函数
确保传入RDKit指纹对象的Python列表,调整后代码:
from rdkit import DataStructs def tanimoto_distance_matrix(fp_list): dissimilarity_matrix = [] for i in range(1, len(fp_list)): # fp_list[:i]是Python列表,符合BulkTanimotoSimilarity参数要求 similarities = DataStructs.BulkTanimotoSimilarity(fp_list[i], fp_list[:i]) dissimilarity_matrix.extend([1 - x for x in similarities]) return dissimilarity_matrix # 计算距离矩阵 dist_matrix_raw = tanimoto_distance_matrix(fp_list)
补充:若为二进制指纹(仅0/1)的处理
如果你的指纹实际是二进制(示例中的3为输入错误),可转换为ExplicitBitVect:
from rdkit.DataStructs.cDataStructs import ExplicitBitVect fp_list = [] for _, row in input_data.iterrows(): fp = ExplicitBitVect(2048) for bit_idx, val in enumerate(row): if val == 1: fp.SetBit(bit_idx) fp_list.append(fp)
关键注意事项
- RDKit指纹计算函数仅识别自身定义的指纹对象,不能直接传入pandas结构。
- 计数型指纹用
SparseIntVect,二进制指纹用ExplicitBitVect,需根据实际指纹类型选择。
内容的提问来源于stack exchange,提问作者user22710686
相关产品推荐
相关产品推荐

