在python中基于两个文件的列坐标合并文件

在python中基于两个文件的列坐标合并文件,python,merge,pandas,Python,Merge,Pandas,我有一个名为snp.txt的文件,如下所示: chrom chromStart chromEnd name strand observed chr1 259 260 rs72477211 + A/G single chr1 433 433 rs56289060 + -/C insertion chr1 491 492 rs55998

我有一个名为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的name列中的rsnumber是否与chrom、chromStart和chromEnd建立的区域相同

例如:

在snp.txt的第一行 rsid rs72477211位于位置259和260之间的chr1上

现在在gene.txt中,NFKB1也在chr1上,但在位置200和270之间, 这意味着RSIDRS72477211位于NFKB1区域,因此这在输出txt中有所说明

我无法在使用熊猫合并功能时做到这一点,我甚至不知道从哪里开始。 这些文件非常大,因此循环效率非常低。
有人能帮忙吗?谢谢

如果适合内存,您可以仅基于
chrom
列使用
outer
方法筛选两个数据帧,然后通过执行范围包含数学来过滤结果:

df = snp.merge(gene, how='outer', on='chrom')
df = df[(df.chromStart_x>=df.chromStart_y) & (df.chromEnd_x<=df.chromEnd_y)]

谢谢,你能解释一下你所说的chromStart_x和y是什么吗?这就是合并的工作原理:chromStart和chromend都存在于两个数据帧中,但我们只是按名称合并。它将向结果数据帧中的重复列添加后缀。看看合并文档
del test['chromStart_y']
del test['chromEnd_y']