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

Pandas如何无迭代实现带条件与计算的行合并?

无需迭代实现DataFrame行合并方案

问题描述

给定初始DataFrame:

import pandas as pd
myData = {'start': [1, 2, 3, 4, 5],
          'end': [2, 3, 5,7,6],
          'number': [1, 2, 7,9, 7]
          }
df = pd.DataFrame(myData, columns=['start', 'end', 'number'])

需要得到目标结果:

result = {'start': [1,  4, 5],
          'end': [7,7,6],
          'number': [10,9, 7]
          }
df_result = pd.DataFrame(result, columns=['start', 'end', 'number'])

合并规则

  • 核心规则:若前一行的end与后一行的start差值小于1,则合并两行——新行start取前一行值,end取后一行值,number为两行之和,同时删除前一行
  • 附加规则:若某行number < 1,则将其与上一行合并——新行start取上一行值,end取当前行值,删除上一行

问题:能否不通过循环迭代实现上述合并?

解决方案

可以利用Pandas的向量化判断与分组聚合操作实现,全程无需迭代循环,效率远高于逐行处理。

实现步骤

  1. 生成合并判断条件
    先分别标记符合核心规则、附加规则的行,再合并为总的合并条件:
    • 核心规则:判断当前行start与前一行end的差值是否小于1
    • 附加规则:判断当前行number是否小于1
  2. 生成分组ID
    基于合并条件生成分组标识:当某行不需要与前一行合并时,分组ID递增,这样连续需要合并的行会被归入同一分组。
  3. 分组聚合
    对每个分组进行聚合:start取组内第一个值,end取组内最后一个值,number取组内求和。

代码实现

import pandas as pd

# 初始化数据
myData = {'start': [1, 2, 3, 4, 5],
          'end': [2, 3, 5,7,6],
          'number': [1, 2, 7,9, 7]
          }
df = pd.DataFrame(myData, columns=['start', 'end', 'number'])

# 1. 定义合并条件
# 核心规则:当前行start - 前一行end < 1
core_merge = df['start'] - df['end'].shift(1) < 1
# 附加规则:当前行number < 1
extra_merge = df['number'] < 1
# 合并所有需要合并的情况
need_merge = core_merge | extra_merge

# 2. 生成分组ID:不需要合并时,分组ID加1
group_ids = (~need_merge).cumsum()

# 3. 分组聚合得到结果
df_result = df.groupby(group_ids).agg(
    start=('start', 'first'),
    end=('end', 'last'),
    number=('number', 'sum')
).reset_index(drop=True)

print(df_result)

说明

  • 若你的核心规则实际是“前一行end与后一行start重叠或连续”(比如start <= end),只需调整core_merge的判断逻辑即可,例如改为df['start'] <= df['end'].shift(1)
  • 该方法完全基于Pandas的向量化操作,避免了循环迭代,处理大数据集时性能优势明显

内容的提问来源于stack exchange,提问作者Nik

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 18:45:33