我试图找到起始/结束 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]
这是你想要的吗?
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)