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

时间:2013-07-03 20:04:14

标签: 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      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,chr​​omStart和chromEnd建立的同一区域内。

例如:

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

现在在gene.txt中,NFKB1也在chr1上,但在位置200和270之间, 这意味着rsid rs72477211位于NFKB1区域,因此在输出txt中注明。

我无法在使用pandas merge功能时这样做,我不确定从哪里开始。 文件非常大,因此循环效率非常低。 有人可以帮忙吗?谢谢!

1 个答案:

答案 0 :(得分:0)

如果它适合内存,您只能outerchrom方法基础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']