基于RDKit实现分子基团与拓扑距离的关联映射及表格生成
实现方案与完整代码
核心思路
- 基团匹配:用RDKit的
GetSubstructMatches基于SMARTS规则定位分子中所有目标基团的原子集合(每个集合对应一个基团实例)。 - 拓扑距离计算:利用RDKit内置的
GetDistanceMatrix直接获取分子中所有原子对的拓扑距离(替代手动实现Dijkstra算法,效率更高且避免重复造轮子)。 - 表格构建:遍历每个SMILES分子,收集各基团所有实例的距离列表,最终用Pandas整理成行(SMILES)列(基团)的表格。
完整代码
import pandas as pd from rdkit import Chem def get_group_instance_distances(mol, group_smarts): """ 获取分子中每个基团实例的内部原子拓扑距离列表 :param mol: RDKit分子对象 :param group_smarts: 基团的SMARTS表达式 :return: 每个基团实例的距离列表组成的列表 """ group_mol = Chem.MolFromSmarts(group_smarts) if not group_mol: return [] # 获取所有基团匹配的原子索引元组 matches = mol.GetSubstructMatches(group_mol) # 获取分子的拓扑距离矩阵 dist_matrix = Chem.GetDistanceMatrix(mol) distance_lists = [] for match in matches: # 计算当前基团实例中所有无序原子对的拓扑距离 instance_dists = [] num_atoms = len(match) for i in range(num_atoms): for j in range(i + 1, num_atoms): instance_dists.append(int(dist_matrix[match[i]][match[j]])) distance_lists.append(instance_dists) return distance_lists def build_smiles_group_distance_table(smiles_list, group_defs): """ 构建SMILES为行、基团为列的距离表格 :param smiles_list: 待处理的SMILES字符串列表 :param group_defs: 字典,键为基团名称,值为对应的SMARTS表达式 :return: Pandas DataFrame表格 """ table_data = [] for smiles in smiles_list: mol = Chem.MolFromSmiles(smiles) row = {"SMILES": smiles} if not mol: # 处理无效SMILES,所有基团列设为空列表 for group_name in group_defs: row[group_name] = [] table_data.append(row) continue # 遍历每个基团,获取距离列表 for group_name, smarts in group_defs.items(): row[group_name] = get_group_instance_distances(mol, smarts) table_data.append(row) return pd.DataFrame(table_data) # ---------------------- 示例使用 ---------------------- if __name__ == "__main__": # 待处理的SMILES列表 sample_smiles = [ "CCO", # 乙醇 "CC(=O)O", # 乙酸 "c1ccccc1O" # 苯酚 ] # 定义需要识别的基团(名称: SMARTS) target_groups = { "羟基": "[O;H1]", # 单羟基氧(匹配带一个氢的O原子) "羰基": "[C;!H0]=O", # 非端基羰基C=O "苯环": "c1ccccc1" # 苯环结构 } # 生成表格 result_df = build_smiles_group_distance_table(sample_smiles, target_groups) # 打印结果 print("生成的距离表格:") print(result_df.to_string())
代码说明
- 基团匹配:通过
GetSubstructMatches获取所有非重叠(默认)的基团原子索引,若需允许重叠匹配,可添加参数uniquify=False。 - 距离计算:
GetDistanceMatrix返回的是基于分子拓扑结构的最短路径距离矩阵,直接调用即可,无需手动实现Dijkstra算法。 - 表格输出:用Pandas DataFrame存储结果,支持导出为CSV/Excel格式(如
result_df.to_csv("distance_table.csv"))。
示例输出
生成的距离表格: SMILES 羟基 羰基 苯环 0 CCO [[0]] [] [] 1 CC(=O)O [[0]] [[1, 2, 1]] [] 2 c1ccccc1O [[0]] [] [[1,2,3,4,5,1,2,3,4,1,2,3,1,2,1]]
注:每个单元格内的子列表对应一个基团实例的内部原子距离,比如苯酚中的苯环实例,列表包含苯环内所有原子对的拓扑距离。
内容的提问来源于stack exchange,提问作者YZman
相关产品推荐
相关产品推荐

