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

Python如何实现两个数据文件的区间匹配并提取对应ID值

基因组区间跨表匹配提取ID实现方法

匹配逻辑梳理

  • 先处理File2的RE_Locus字段:把chrN:start-end格式的字符串拆成独立的染色体编号、区间起始值、区间终止值三个字段,用来和File1做关联
  • 匹配规则默认按区间起止位置完全一致+染色体号一致做精确匹配,如果需求是区间有重叠就算匹配,替换对应判断条件即可
  • 匹配成功后提取File1对应的ID字段,最终输出仅含ID列的结果文件

可直接运行的Python实现代码

先安装依赖库:pip install pandas

import pandas as pd
import re

# 读取两个CSV输入文件,替换成本地实际文件路径
file1 = pd.read_csv("your_path/File1.csv")
file2 = pd.read_csv("your_path/File2.csv")

# 定义RE_Locus字段解析函数
def parse_re_locus(locus_text):
    chr_num, start, end = re.findall(r"chr(\d+):(\d+)-(\d+)", locus_text)[0]
    return int(chr_num), int(start), int(end)

# 给File2新增解析后的匹配字段
file2[["Chr", "Locus_Start", "Locus_End"]] = file2["RE_Locus"].apply(
    lambda x: pd.Series(parse_re_locus(x))
)

# 关联两张表做匹配
# 精确起止匹配用下面的逻辑
match_result = pd.merge(file1, file2, on="Chr", how="inner").query(
    "Start == Locus_Start and End == Locus_End"
)
# 如果要做区间重叠匹配,把上面query的内容换成下面这行注释的代码
# match_result = pd.merge(file1, file2, on="Chr", how="inner").query("Start <= Locus_End and End >= Locus_Start")

# 导出要求格式的结果
final_output = match_result[["ID"]].drop_duplicates()
final_output.to_csv("match_id_result.csv", index=False)
print("匹配完成,结果预览:")
print(final_output)

补充说明

  • 你贴出的示例测试数据中,File1的所有区间都在6:38517417-38519771范围,File2的所有RE区间都在6:39041458-39053106范围,两个数据集的坐标没有重叠,跑这份示例数据不会输出匹配结果,替换成实际生产数据即可得到正确结果。
  • 如果单表数据量超过10万行,建议换用pyranges库做区间匹配,运算效率会比pandas高50倍以上,适合大规模基因组数据处理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 03:45:33