如何将原子计数函数整合到Python脚本处理化学CSV数据
实现CSV中分子式原子计数的功能整合
你的countAtoms函数已经能正确解析分子式并统计原子数,只需把它和Pandas的apply方法结合,就能批量填充H、C、N、O、S列的数值。以下是修改后的完整代码:
import pandas as pd import copy import re df = pd.read_csv('AminoAcids.csv') def countAtoms(string, dict={}): curDict = copy.copy(dict) # 先去除分子式中的空格,避免正则匹配异常 string = string.strip() atoms = re.findall("[A-Z]{1}[a-z]*[0-9]*", string) for j in atoms: atomGroups = re.match('([A-Z]{1}[a-z]*)([0-9]*)', j) atom = atomGroups.group(1) number = atomGroups.group(2) try : curDict[atom] = curDict[atom] + int(number) except KeyError: try : curDict[atom] = int(number) except ValueError: curDict[atom] = 1 except ValueError: curDict[atom] = curDict[atom] + 1 return curDict # 填充分子式和分子量列 df["Formula"] = ['C3H7NO2', 'C6H14N4O2 ','C4H8N2O3','C4H7NO4 ', 'C3H7NO2S ','C5H9NO4','C5H10N2O3','C2H5NO2 ','C6H9N3O2', 'C6H13NO2','C6H13NO2','C6H14N2O2 ','C5H11NO2S ','C9H11NO2', 'C5H9NO2 ','C3H7NO3','C4H9NO3 ','C11H12N2O2 ','C9H11NO3 ','C5H11NO2'] df["Molecular Weight"] = ['89.09','174.2','132.12', '133.1','121.16','147.13','146.14','75.07','155.15', '131.17','131.17','146.19','149.21','165.19','115.13', '105.09','119.12','204.22','181.19','117.15'] # 定义解析函数,从countAtoms的结果中提取指定原子数,不存在则返回0 def get_atom_counts(formula): atom_dict = countAtoms(formula) return pd.Series([ atom_dict.get('H', 0), atom_dict.get('C', 0), atom_dict.get('N', 0), atom_dict.get('O', 0), atom_dict.get('S', 0) ], index=['H', 'C', 'N', 'O', 'S']) # 批量填充原子数列 df[['H', 'C', 'N', 'O', 'S']] = df['Formula'].apply(get_atom_counts) # 保存并输出结果 df.to_csv("AminoAcids.csv", index=False) print(df.to_string())
关键修改说明:
- 给
countAtoms函数加了string.strip(),处理分子式里的空格,避免正则解析出错 - 新增
get_atom_counts函数,调用countAtoms后,用dict.get()提取目标原子的数量,没有该原子时返回0 - 用
df['Formula'].apply(get_atom_counts)批量处理所有分子式,直接把结果赋值给对应的原子数列,替换原来的手动初始化0的操作
内容的提问来源于stack exchange,提问作者sabina aliyeva
相关产品推荐
相关产品推荐

