Pandas实现两列值重叠的连续数据行折叠合并
Pandas 连续重叠区间折叠聚合实现
实现思路
针对相邻行区间重叠/衔接(当前行age_end等于下一行age_start也算满足合并规则)的聚合需求,不需要写循环逐行判断,用pandas内置的累计计算方法就能高效实现,支持任意长度的连续行合并:
- 第一步:逐行判断当前行是否和前面的连续区间断开,断开则新增分组ID
- 第二步:按分组ID聚合,每组取
age_start最小值、age_end最大值即可
完整代码
import pandas as pd # 加载/构造原始数据 df = pd.DataFrame({ 'age_start': [2, 6, 11, 17, 21, 27, 30], 'age_end': [6, 10, 16, 18, 25, 30, 34] }) # 生成分组标记:当前行起始值大于之前所有行的最大结束值时,新增分组 df['group_tag'] = (df['age_start'] > df['age_end'].shift(fill_value=0).cummax()).cumsum() # 分组聚合得到结果 result = df.groupby('group_tag', as_index=False).agg( age_start=('age_start', 'min'), age_end=('age_end', 'max') ).drop(columns='group_tag')
结果验证
执行代码后输出的result完全匹配预期结果:
| age_start | age_end |
|---|---|
| 2 | 10 |
| 11 | 16 |
| 17 | 18 |
| 21 | 25 |
| 27 | 34 |
关键逻辑说明
shift(fill_value=0)把age_end列向下移一位,让每一行能拿到前一行的结束值,第一行用0填充避免空值cummax()逐行计算累计到当前位置的最大结束值,哪怕前面有N行连续重叠的区间,也能拿到整个连续块的最大结束值- 布尔值累加
cumsum()会自动给每个连续块分配唯一的分组ID,不需要手动循环计数 - 如果原始数据不是按区间顺序排列的,先执行
df = df.sort_values('age_start').reset_index(drop=True)再跑后续逻辑即可
内容的提问来源于stack exchange,提问作者manutd2022
相关产品推荐
相关产品推荐

