基于Pandas实现按起止位置合并行并计算累计和
用Pandas/Numpy高效合并连续区间的DataFrame行
需求:处理包含start(起始位置)、end(结束位置)和value字段的DataFrame,合并满足上一行end与下一行start间距小于5的行,累加对应value值,输出合并后的起止位置及累计和。
示例输入数据
start end value 1 0 10 3 2 11 15 4 3 17 20 5 4 45 50 3 5 51 60 13 6 100 120 9
期望输出
两种结果均可:
- 若所有相邻区间间距均≥5,输出与原数据一致:
start end value 1 0 10 3 2 11 15 4 3 17 20 5 4 45 50 3 5 51 60 13 6 100 120 9
- 若存在间距<5的相邻区间,合并后输出:
start end sum 0 0 20 12 1 45 60 16 2 100 120 9
纯Pandas/Numpy高效解决方案
以下方案采用向量化操作,无lambda函数,适合大数据量场景:
import pandas as pd import numpy as np # 1. 构造/加载数据 data = { 'start': [0, 11, 17, 45, 51, 100], 'end': [10, 15, 20, 50, 60, 120], 'value': [3, 4, 5, 3, 13, 9] } df = pd.DataFrame(data, index=[1,2,3,4,5,6]) # 2. 确保数据按start升序(若原始数据无序必须执行) df = df.sort_values('start').reset_index(drop=True) # 3. 计算相邻区间的间距,生成分组标识 # 计算下一行start与当前行end的差值 gap = df['start'].iloc[1:] - df['end'].iloc[:-1] # 间距≥5时标记为新组,用cumsum生成连续的分组ID group_ids = np.cumsum(np.concatenate([[1], (gap >= 5).astype(int)])) # 4. 按分组聚合得到结果 merged_df = df.groupby(group_ids).agg( start=('start', 'first'), end=('end', 'last'), sum=('value', 'sum') ).reset_index(drop=True) print(merged_df)
方案说明
- 全程使用Pandas/Numpy的向量化API,避免了循环和lambda带来的性能损耗
- 自动适配两种场景:当所有相邻间距≥5时,分组ID每行唯一,结果与原数据结构一致;当存在间距<5的区间时,自动合并同组行
- 聚合逻辑清晰:取每组的第一个
start、最后一个end,累加value得到sum
内容的提问来源于stack exchange,提问作者mikaelstestingonetwothree
相关产品推荐
相关产品推荐

