【问题标题】:Merge records that follow one another within group合并组内一个接一个的记录
【发布时间】:2022-11-15 16:28:57
【问题描述】:

我有以下数据框:

   A  B start_date   end_date  id
0  1  2 2022-01-01 2022-01-10   1
1  2  2 2022-02-02 2022-02-05   2
2  1  2 2022-01-11 2022-01-15   3
3  2  2 2022-02-06 2022-02-10   4
4  2  2 2022-02-11 2022-02-15   5
5  2  3 2022-01-14 2022-01-17   6
6  2  3 2022-01-19 2022-01-22   7

有几个记录一个接一个。例如,第 1 行和第 3 行。第 3 行具有相同的值 A 和 B,并在第 1 行结束时从第二天开始。我想将此数据帧压缩为以下形式:

   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

也就是说,我保存一条记录,其中下一条记录的 start_date 与前一条记录的 end_date 之间的差异为 1 天。在这种情况下,对于此类序列中的最后一条记录,end_date 更改为 end_date。

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    您可以使用自定义石斑鱼来加入每个组的连续日期:

    df[['start_date', 'end_date']] = df[['start_date', 'end_date']].apply(pd.to_datetime)
    
    m = (df['end_date'].sub(df.groupby(['A', 'B'])
                            ['start_date'].shift(-1)
                              .sub(pd.Timedelta('1d'))
                            ).eq('0')
          .groupby([df['A'], df['B']]).cumsum()
        )
    
    out = (df
     .groupby(['A', 'B', m], as_index=False)
     .agg({'start_date': 'first', 'end_date': 'last'})
     .assign(id=lambda d: range(1, len(d)+1))
    )
    

    输出:

       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-05   2
    2  2  2 2022-02-06 2022-02-15   3
    3  2  3 2022-01-14 2022-01-22   4
    

    【讨论】:

      猜你喜欢
      • 2015-04-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多