You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 04:35:32