列中基因计数异常排查:为何代码仅统计到部分基因?
问题与解决方案
问题背景
统计每行细菌样本中基因名的出现次数(查看重复拷贝数),已完成基因名列合并,相关代码与数据如下:
合并列代码:
df3['AMRs'] = df3[df3.columns[0:]].apply(lambda x: ','.join(x.dropna().astype(str)),axis=1)
合并后AMRs列数据示例:
0 fosX,vga(G) 1 fosX,vga(G) ... # 样本总行数:18022
统计基因出现次数的代码:
y= {} # dict for X in genenames: y[X] = df2["AMRs"].str.count(X) for key in list(y.keys()): print(key, ':', y[key])
其中genenames为包含100个基因的列表,示例:
['fosX', 'vga(G)', 'emrC', 'tet(M)', ... , 'vga', 'vga=HMM']
异常结果:fosX每行计数为1,vga(G)每行计数为0,无关基因vga计数却为1,与实际样本情况不符。
问题原因
- 正则特殊字符未处理:Pandas的
str.count()默认按正则表达式规则匹配,vga(G)中的()属于正则分组元字符,会被解析为语法而非字面括号,导致无法匹配样本中的vga(G);而vga作为普通字符串,会匹配vga(G)里的前缀部分,因此计数为1。 - DataFrame对象混用:合并列操作的是
df3,但统计时调用的是df2,若df2没有正确的AMRs列,会直接导致统计结果异常。
解决办法
方案1:关闭正则匹配(推荐)
给str.count()添加regex=False参数,强制按字面字符串匹配,同时修正DataFrame对象引用:
y = {} for X in genenames: y[X] = df3["AMRs"].str.count(X, regex=False) for key in list(y.keys()): print(key, ':', y[key])
方案2:转义正则特殊字符
若需保留正则匹配能力,使用re.escape()转义基因名中的特殊元字符:
import re y = {} for X in genenames: escaped_gene = re.escape(X) y[X] = df3["AMRs"].str.count(escaped_gene) for key in list(y.keys()): print(key, ':', y[key])
方案3:修正DataFrame引用
确保统计时使用的是完成列合并操作的df3,避免混用df2。
内容的提问来源于stack exchange,提问作者Dragoran21
相关产品推荐
相关产品推荐

