2013-07-03 43 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