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

如何基于基因名称前缀匹配统计DataFrame与基因列表的匹配次数?

解决基因前缀匹配并统计唯一基因种类数的问题

我来帮你搞定这个需求——核心是要先从带后缀的基因ID里提取出前缀,再统计唯一匹配的基因种类,而不是像原代码那样统计匹配的行数。下面是分步的解决方案:

问题分析

你的原代码用str.contains结合行匹配计数,得到的是满足条件的行数(示例里的6),但我们需要的是去重后的基因种类数(示例里的2)。另外需要准确提取基因ID的前缀,和目标列表里的基因名称对应上。

解决方案代码

import pandas as pd
import re  # 用于更鲁棒的前缀提取(可选)

# 1. 读取数据并清理冗余列
df = pd.read_csv("test_busco_augus.csv", sep=',')
# 自动移除所有Unnamed开头的冗余列
df = df.drop(columns=[col for col in df.columns if 'Unnamed' in col], errors='ignore')

# 2. 定义目标基因前缀列表并预处理
liste = ["EOG090X00LI_", "EOG090X00GO_", "EOG090X00BA_"]
# 去掉每个前缀末尾的下划线,转换成集合(集合查找速度比列表快)
target_prefixes = {prefix.rstrip('_') for prefix in liste}

# 3. 编写前缀提取函数
def extract_gene_prefix(gene_id):
    # 方案1:按第一个下划线分割(适合固定格式的ID)
    # return gene_id.split('_', 1)[0]
    
    # 方案2:用正则匹配更鲁棒(适配可能的复杂格式)
    match = re.match(r'([A-Z0-9]+)_', gene_id)
    return match.group(1) if match else gene_id  # 无下划线时返回原ID

# 4. 提取所有基因ID的前缀
# 合并qseqid和sseqid两列的所有基因ID
all_gene_ids = pd.concat([df['qseqid'], df['sseqid']])
# 对每个ID提取前缀
all_prefixes = all_gene_ids.apply(extract_gene_prefix)

# 5. 筛选匹配的前缀并统计唯一数量
# 找出在目标集合里的前缀
matching_prefixes = all_prefixes[all_prefixes.isin(target_prefixes)]
# 去重后统计数量
unique_match_count = matching_prefixes.nunique()

print(f"唯一匹配的基因种类数:{unique_match_count}")

代码解释

  • 数据清理:自动移除冗余的Unnamed列,避免后续操作出错。
  • 目标集合预处理:把列表转成集合,同时去掉末尾的下划线,让匹配更准确且查找效率更高。
  • 前缀提取:提供两种方案,第一种适合格式固定的ID(第一个下划线前是前缀),第二种用正则更灵活,能适配更多可能的ID格式。
  • 合并与去重:把两列的基因ID合并后统一处理,最后用nunique()统计去重后的匹配数量,这就是我们需要的最终结果。

原代码的问题说明

原代码的(m1 & m2).sum()是统计同时满足qseqid和sseqid都包含目标前缀的行数,而不是统计唯一的基因种类。比如你的示例里有6行满足这个条件,但这些行都属于2个基因,所以得到的6不是你需要的结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 06:44:47