如何使用python知道某个职位是否位于某个区域

如何使用python知道某个职位是否位于某个区域,python,Python,我有两个文件 文件A有3列:染色体、起始位置、结束位置 CHR,START,END chr1,1203245,1203374 chr1,1202020,1202213 chr1,1201293,1201465 chr1,1200844,1201128 chr1,1200527,1200585 文件B有两列:染色体、位置 CHR,START,END chr1,1203245,1203374 chr1,1202020,1202213 chr1,1201293,1201465 chr1,120084

我有两个文件

文件A有3列:染色体、起始位置、结束位置

CHR,START,END
chr1,1203245,1203374
chr1,1202020,1202213
chr1,1201293,1201465
chr1,1200844,1201128
chr1,1200527,1200585
文件B有两列:染色体、位置

CHR,START,END
chr1,1203245,1203374
chr1,1202020,1202213
chr1,1201293,1201465
chr1,1200844,1201128
chr1,1200527,1200585
CHR,POS
chr1,1579264
chr1,1641372
chr1,3020521
chr2,2097836
chr3,2374462       
两个文件都很大

如何使用python确定文件B的每个位置在文件A的任何区域中?如果只有一个位置和一个区域,我可以编写代码,但我没有区域列表的线索


位置在一个区域中
意味着
CHR
应该是相同的,并且
POS>=开始和POS我将您的问题解释为“B的每一行的POS值是否在a的所有行的任何开始和结束值之间?”如果这是正确的,那么使用数据分析库,类似的方法将起作用:

import pandas as pd

A = pd.read_csv('path/to/A.csv')
B = pd.read_csv('path/to/B.csv')

for i, r in B.iterrows():
    B.loc[i, 'in_A'] = any((r.POS > A.START) & (r.POS < A.END))

print(B)

>>     CHR      POS   in_A
    0  chr1  1579264  False
    1  chr1  1641372  False
    2  chr1  3020521  False
    3  chr2  2097836  False
    4  chr3  2374462  False
将熊猫作为pd导入
A=pd.read\u csv('path/to/A.csv')
B=pd.read\u csv('path/to/B.csv'))
对于B中的i,r。iterrows():
B.loc[i,'in_A']=任何((r.POS>A.START)和(r.POS>CHR POS in_A
0 chr1 1579264错误
1 chr1 1641372错误
2 chr1 3020521错误
3 chr2 2097836错误
4 chr3 2374462错误
这将遍历B中的每一行,并为a中的所有行生成一个布尔数组,其中(POS>开始)和(POS<结束)。然后在B数据帧中生成一个新列,如果POS位于a中的任何开始/结束限制内,则为真

有道理吗

  • 如果你的文件很大,你不能在一个数据框中同时加载这两个文件,因为它会填满你的整个内存

  • 不要将B的位置与A中的每个间隔进行比较,因为这是非常低效的(请理解:非常非常慢)

  • 相反,请执行以下操作:

  • 按色度、开始、结束对两个文件进行排序

  • 同时在两个文件的行上迭代。类似这样的情况(出于这个想法,它没有考虑染色体,可能有缺陷,另外你需要定义保存位置的方式):

    a=打开(“a”)
    b=开放(“b”)
    #初始化
    (色度、开始、结束)=a.readline().split(“,”)
    (chromB,pos)=b.readline().split(“,”)
    而1:
    尝试:
    如果位置<开始:
    #读B的更多行
    (chromB,pos)=b.readline().split(“,”)
    elif pos>结束:
    #从一本书中多读几行
    (色度、开始、结束)=a.readline().split(“,”)
    其他:
    #Pos处于[开始,结束]间隔
    #保存结果并转到下一个pos
    savePos()
    (chromB,pos)=b.readline().split(“,”)
    除停止迭代外:
    打破
    

  • 不过,我真正的建议是不要像过去的每一位生物信息学家那样手动操作,而是使用“bedtools”或现有的Python库,如BioPython。重新发明轮子是研究时间和资源的巨大损失。

    您能通过编辑您的问题向我们展示一下输入和输出的示例吗?我想正则表达式就可以了。为了给你一个例子,我们必须知道POS列和开始/结束之间的关系。请您再次更新您的问题,解释什么是匹配?非常感谢您的帮助。我像这样使用熊猫:`B.loc[I',in_A']=any((r.CHR==A.CHR)&(r.POS>=A.SATRT)&(r.POS)它很慢,因为这个答案将每个位置与另一个文件中的每个间隔进行比较,所以它会随着长度(A)x长度(B)而增长。如果你以前对文件进行过排序,你可以想出更聪明的方法。这会将两个文件完全加载到内存中;OP说它们“很大”,如果它们真的很大,这将永远不会起作用。
    a = open("A")
    b = open("B")
    # init
    (chromA,start,end) = a.readline().split(",")
    (chromB,pos) = b.readline().split(",")
    while 1:
        try:
            if pos < start:
                # Read more lines from B
                (chromB,pos) = b.readline().split(",")
            elif pos > end:
                # Read more lines from A
                (chromA,start,end) = a.readline().split(",")
            else:
                # Pos is in the [start, end] interval
                # Save the result and go to the next pos
                savePos()  
                (chromB,pos) = b.readline().split(",")
        except StopIteration:
            break