如何在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
相关产品推荐
相关产品推荐

