查找 DNA 坐标内不重叠的区间

问题描述 投票:0回答:1

我试图找到起始/结束 DNA 坐标(在同一染色体上)的非重叠间隔。我很难开发一个考虑同一外显子上两行的函数。非重叠间隔必须是唯一的(不与任何其他间隔重叠)。

例如,在下面的第一行,非重叠区间为 1-49、61-100。但是,如果查看第二行,非重叠区间将为 1-69, 81,100。我想要non-overlapping,不重叠的区间,所以我想要的真实区间输出是1-49, 61-69, 81-100。不确定我是否应该输出为单独的列或 df,但这是我想要的最终输出。

开始DF

chrom        exon_start    exon_end   start1      end1   
1                  1       100        50           60      
1                  1       100        70           80      
2                  5       50         25           100     

最终DF

chrom   exon_start    exon_end   start1   end1   non_overlap_start  non_overlap_end
1           1             100    50      60      [1, 61, 81]        [49, 69, 100]
1           1             100    70      80      [1, 61, 81]        [49, 69, 100]
2           5             50     25      100     [25]               [50] 

python pandas dataframe bioinformatics
1个回答
0
投票

这是你想要的吗?

def find_non_overlap(part):
    t = np.array([np.concatenate((
                np.ones(1), # add additional True from each side
                np.zeros(row.start - row.ex_start), 
                np.ones(row.end - row.start), 
                np.zeros(row.ex_end - row.end),
                np.ones(1)
            )) for _, row in part.iterrows()])
    changes = part.ex_start.iloc[0] + np.flatnonzero(np.diff(np.logical_or.reduce(t)))
    return changes[::2], changes[1::2]

df = pd.DataFrame([
    [0, 100, 50, 60],
    [0, 100, 20, 30],
    [0, 100, 25, 40],
    [0, 100, 90, 100],
    [0, 100, 0, 5],
    [10, 50, 12, 15]
], columns=['ex_start', 'ex_end', 'start', 'end'])
df.groupby(['ex_start', 'ex_end'])[df.columns].apply(find_non_overlap)
© www.soinside.com 2019 - 2024. All rights reserved.