Pandas按条件合并连续行的最高效计算实现方案
高效实现方案
可以使用pandas向量化分组聚合操作实现需求,避免逐行遍历,在数据量较大时效率提升非常明显,具体实现如下:
核心逻辑
我们可以给每一个head以及它后面跟着的所有连续tail分配同一个分组ID,之后按分组聚合即可:
- 分组规则:每次遇到
position为head的行时,分组ID加1,后续连续的tail行复用同一个分组ID,通过布尔序列累加cumsum()即可快速生成分组ID - 聚合规则:
position取分组内最后一行的值,天然符合「有后续tail则标记为tail,否则保留head」的规则start取分组内第一行的值end取分组内最后一行的值
实现代码
import pandas as pd # 原始DataFrame df = pd.DataFrame({ 'position': ['head', 'tail', 'head', 'head', 'head', 'tail', 'tail', 'head'], 'start': [2, 13, 54, 320, 654, 677, 3430, 9000], 'end': [4, 15, 564, 390, 674, 679, 6000, 9010], }) # 生成分组ID df['group'] = (df['position'] == 'head').cumsum() # 按分组聚合得到结果 result = df.groupby('group').agg( position=('position', 'last'), start=('start', 'first'), end=('end', 'last') ).reset_index(drop=True) print(result)
输出验证
运行代码得到的结果和预期完全一致:
position start end 0 tail 2 15 1 head 54 564 2 head 320 390 3 tail 654 6000 4 head 9000 9010
效率说明
这种向量化操作的时间复杂度为O(n),所有运算都在pandas底层C语言层执行,相比Python层的iterrows遍历,在十万行以上的数据集中,速度可以快几十到上百倍。
内容的提问来源于stack exchange,提问作者SantoshGupta7
相关产品推荐
相关产品推荐

