按组合并连续衔接的DataFrame记录
合并DataFrame中连续衔接的记录
原始数据
先构造你提供的DataFrame:
import pandas as pd df = pd.DataFrame({ 'A': [1,2,1,2,2,2,2], 'B': [2,2,2,2,2,3,3], 'start_date': ['2022-01-01', '2022-02-02', '2022-01-11', '2022-02-06', '2022-02-11', '2022-01-14', '2022-01-19'], 'end_date': ['2022-01-10', '2022-02-05', '2022-01-15', '2022-02-10', '2022-02-15', '2022-01-17', '2022-01-22'], 'id': [1,2,3,4,5,6,7] })
处理步骤
- 转换日期列类型:把
start_date和end_date转为datetime格式,方便做日期差值计算 - 分组排序:按
A、B字段分组,组内按start_date升序排列,确保记录按时间顺序处理 - 标记连续组:在每个分组内,判断当前行的
start_date是否等于上一行end_date的次日,若不满足则标记为新组 - 聚合合并:按
A、B和连续组标识聚合,取每组的第一个start_date、最后一个end_date和第一个id,最后重置结果的id列
完整代码
# 转换日期类型 df['start_date'] = pd.to_datetime(df['start_date']) df['end_date'] = pd.to_datetime(df['end_date']) # 按A、B分组并按日期排序 df_sorted = df.sort_values(['A', 'B', 'start_date']).reset_index(drop=True) # 生成连续组标识 df_sorted['group'] = ( (df_sorted['start_date'] != df_sorted.groupby(['A', 'B'])['end_date'].shift(1) + pd.Timedelta(days=1)) .cumsum() ) # 聚合得到合并后的结果 result = df_sorted.groupby(['A', 'B', 'group']).agg( start_date=('start_date', 'first'), end_date=('end_date', 'last'), id=('id', 'first') ).reset_index(drop=['group']).reset_index(drop=True) # 重置id列匹配示例输出 result['id'] = result.index + 1 print(result)
输出结果
A B start_date end_date id 0 1 2 2022-01-01 2022-01-15 1 1 2 2 2022-02-02 2022-02-15 2 2 2 3 2022-01-14 2022-01-17 3 3 2 3 2022-01-19 2022-01-22 4
内容的提问来源于stack exchange,提问作者Fissium
相关产品推荐
相关产品推荐

