pandas如何基于两列合并满足起止时间连续条件的多行数据
pandas区间合并最优实现方案
你可以通过分组打标+二次聚合的方式实现需求,性能远高于iterrows遍历,完整实现代码如下:
import pandas as pd # 构造示例数据 df = pd.DataFrame({ "Name1": ["aaa", "aaa", "aaa", "ccc", "ccc", "ccc"], "Name2": ["bbb", "bbb", "bbb", "ddd", "ddd", "ddd"], "Start": [1, 2, 30, 100, 145, 160], "End": [2, 22, 42, 141, 160, 178] }) # 1. 按Name1、Name2分组,为可合并的连续区间生成相同分组标记 df["merge_flag"] = df.groupby(["Name1", "Name2"], group_keys=False).apply( lambda g: (g["Start"] != g["End"].shift(fill_value=-1)).cumsum() ) # 2. 按名称字段+合并标记分组聚合,得到最终结果 result = df.groupby(["Name1", "Name2", "merge_flag"], as_index=False).agg( Start=("Start", "min"), End=("End", "max") ).drop(columns="merge_flag") print(result)
逻辑说明
- 第一步先限定仅在
Name1、Name2取值相同的组内做判断,g["End"].shift()会取同组内上一行的End值,和当前行Start对比,不相等则认为是新的独立区间,累加得到的merge_flag相同的行即为可合并的连续区间 - 第二步聚合时取每个合并组的最小
Start和最大End,即可得到合并后的结果 - 该方案时间复杂度为O(n),数据量越大相比iterrows的性能优势越明显
内容的提问来源于stack exchange,提问作者Travis Huang
相关产品推荐
相关产品推荐

