如何用Pandas对连续相同分组键的基因组区间进行聚合?
解决连续区间聚合的实现方法
核心思路
要实现仅聚合连续的同分组行,关键是先给连续的同组行打上唯一分组标记,再基于标记聚合区间。普通groupby无法区分连续/非连续的同组行,而通过生成连续组ID就能解决这个问题。
具体步骤(Pandas实现)
- 先排序:确保数据按染色体、臂、起始位置排序,保证连续的区间在DataFrame中是相邻行
df = df.sort_values(['Chromosome', 'arm', 'Start'])
- 生成连续组标记:对比当前行与上一行的
Chromosome、arm、ratio_median,只要任一字段不同,就生成新的组ID
# 标记当前行与上一行是否属于不同组 is_new_group = (df[['Chromosome', 'arm', 'ratio_median']] != df[['Chromosome', 'arm', 'ratio_median']].shift()).any(axis=1) # 累加标记生成连续组ID df['group_id'] = is_new_group.cumsum()
- 按组聚合区间:基于组ID和分组字段,取
Start最小值、End最大值
result = df.groupby(['group_id', 'Chromosome', 'arm', 'ratio_median']).agg( Start=('Start', 'min'), End=('End', 'max') ).reset_index(drop=True)
原理说明
shift()将上一行的分组字段下移,与当前行对比,判断是否进入新组cumsum()对新组标记累加,让连续的同组行拥有相同的group_id,非连续的同组行则对应不同group_id- 最终按
group_id分组聚合,就能避免把非连续的同区间合并
内容的提问来源于stack exchange,提问作者Einar
相关产品推荐
相关产品推荐

