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
相关产品推荐
相关产品推荐

