我有一个名为snp.txt的文件,如下所示:
chrom chromStart chromEnd name strand observed
chr1 259 260 rs72477211 + A/G single
chr1 433 433 rs56289060 + -/C insertion
chr1 491 492 rs55998931 + C/T single
chr1 518 519 rs62636508 + C/G single
chr1 582 583 rs58108140 + A/G single
我有第二个文件gene.txt
chrom chromStart chromEnd tf_title tf_score
chr1 200 270 NFKB1 123
chr1 420 440 IRF4 234
chr1 488 550 BCL3 231
chr1 513 579 TCF12 12
chr1 582 583 BAD170 89
我想要的最终输出是:output.txt
chrom chromStart chromEnd name strand observed tf_title tf_score
chr1 259 260 rs72477211 + A/G NFKB1 123
chr1 433 433 rs56289060 + -/C IRF4 234
chr1 491 492 rs55998931 + C/T BCL3 231
chr1 518 519 rs62636508 + C/G TCF12 12
chr1 582 583 rs58108140 + A/G BAD170 89
我希望能够做的关键是查看gene.txt并检查snp.txt名称列中的rsnumber是否在chrom,chromStart和chromEnd建立的同一区域内。
例如:
在snp.txt的第一行 rsid rs72477211在位置259和260之间的chr1上。
现在在gene.txt中,NFKB1也在chr1上,但在位置200和270之间, 这意味着rsid rs72477211位于NFKB1区域,因此在输出txt中注明。
我无法在使用pandas merge功能时这样做,我不确定从哪里开始。 文件非常大,因此循环效率非常低。 有人可以帮忙吗?谢谢!
答案 0 :(得分:0)
如果它适合内存,您只能outer
列chrom
方法基础merge
两个数据帧,然后通过执行范围包含数学过滤结果:
df = snp.merge(gene, how='outer', on='chrom')
df = df[(df.chromStart_x>=df.chromStart_y) & (df.chromEnd_x<=df.chromEnd_y)]
您最终可以删除重复的列:
del test['chromStart_y']
del test['chromEnd_y']