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

按组合并连续衔接的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]
})

处理步骤

  1. 转换日期列类型:把start_date和end_date转为datetime格式,方便做日期差值计算
  2. 分组排序:按A、B字段分组,组内按start_date升序排列,确保记录按时间顺序处理
  3. 标记连续组:在每个分组内,判断当前行的start_date是否等于上一行end_date的次日,若不满足则标记为新组
  4. 聚合合并:按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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 15:41:13