You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Pandas中忽略化合物元素顺序进行数据比对?

忽略分子式元素顺序比对化合物重叠项的简便解法

核心思路是将每个分子式转换成标准化的统一格式——不管原始元素顺序如何,转换后相同的字符串即代表同一种化合物。以下是针对Pandas的具体实现步骤:

1. 编写分子式标准化函数

用正则表达式拆分分子式中的元素和对应计数,按元素名称排序后重新拼接,确保相同化合物的分子式输出一致:

import re
import pandas as pd

def standardize_formula(formula):
    # 匹配元素(大写开头,可跟小写字母)和后续的计数数字(可选)
    elem_count_pairs = re.findall(r'([A-Z][a-z]?)(\d*)', formula)
    # 对元素按名称排序,无计数的元素默认计为1
    sorted_pairs = sorted(elem_count_pairs, key=lambda x: x[0])
    # 拼接成标准化字符串,计数为1时省略数字
    return ''.join(f"{elem}{count if count else ''}" for elem, count in sorted_pairs)

2. 为两个数据集添加标准化分子式列

假设你的两个DataFrame分别为df1和df2,都包含存储分子式的列(比如名为Molecular Formula):

df1['standard_formula'] = df1['Molecular Formula'].apply(standardize_formula)
df2['standard_formula'] = df2['Molecular Formula'].apply(standardize_formula)

3. 查找重叠项

  • 方法一:获取完整重叠数据(包含双方属性)
    用merge关联两个数据集,得到标准化分子式相同的所有行,自动区分两边的属性列:
overlap_full = pd.merge(df1, df2, on='standard_formula', suffixes=('_db1', '_db2'))
  • 方法二:筛选出某一数据集中在另一数据集存在的化合物
    如果只需要从df1里找出在df2中出现的化合物,用isin即可:
df1_overlap = df1[df1['standard_formula'].isin(df2['standard_formula'])]

注意事项

如果你的分子式包含括号(比如(OH)2),上述基础正则无法处理括号展开,需要额外的逻辑。但如果你的数据都是无括号的简单分子式,上面的方法完全够用且简便。

内容的提问来源于stack exchange,提问作者Liam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 22:07:26