2013-07-03 12 views
1

我有一个叫snp.txt该文件是这样的:合并文件坐标的两个文件在python

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,并检查是否在日的rsnumber snp.txt的名字列位于由chrom,chr​​omStart和chromEnd建立的相同区域。

例如:

在snp.txt 的RSID rs72477211的第一行是在位置259和260。

现在gene.txt之间CHR1,NFKB1也在CHR1但位置之间200和270, 这意味着rsid rs72477211位于NFKB1区域,所以在输出txt中记录了这一点。

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

回答

0

如果它装入内存,你可以merge两个dataframes与outer方法库仅在chrom列,然后通过执行范围包括数学筛选结果:

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'] 
+0

谢谢,你能解释一下,你指的是什么,chromStart_x和y? – CadisEtRama

+0

合并的工作原理如下:chromstart和chromend都存在于两个数据框中,但我们仅合并名称。它会为结果数据框中的重复列添加后缀。看看合并文档 – Boud