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的向量化判断与分组聚合操作实现,全程无需迭代循环,效率远高于逐行处理。
实现步骤
- 生成合并判断条件
先分别标记符合核心规则、附加规则的行,再合并为总的合并条件:- 核心规则:判断当前行
start与前一行end的差值是否小于1 - 附加规则:判断当前行
number是否小于1
- 核心规则:判断当前行
- 生成分组ID
基于合并条件生成分组标识:当某行不需要与前一行合并时,分组ID递增,这样连续需要合并的行会被归入同一分组。 - 分组聚合
对每个分组进行聚合: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
相关产品推荐
相关产品推荐

