1

我有一个名为 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 位于 chr1 的位置 259 和 260 之间。

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

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

4

1 回答 1

0

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

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']
于 2013-07-03T20:33:55.680 回答