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

列中基因计数异常排查:为何代码仅统计到部分基因?

问题与解决方案

问题背景

统计每行细菌样本中基因名的出现次数(查看重复拷贝数),已完成基因名列合并,相关代码与数据如下:

合并列代码:

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 18:00:05