pandas -按连续日期时间段分组

2022-02-26 00:00:00 python pandas pandas-groupby

问题描述

我有一个 pandas 数据帧,如下所示:

    KEY   START       END         VALUE
0   A     2017-01-01  2017-01-16  2.1
1   B     2017-01-01  2017-01-23  4.3
2   B     2017-01-23  2017-02-10  1.7
3   A     2017-01-28  2017-02-02  4.2
4   A     2017-02-02  2017-03-01  0.8  
我希望groupbyKEYsumVALUE上,但仅在连续的时间段上。例如,在上面的示例中,我希望获得:

   KEY  START       END         VALUE 
0  A    2017-01-01  2017-01-16  2.1
1  A    2017-01-28  2017-03-01  5.0
2  B    2017-01-01  2017-02-10  6.0
由于时间间隔,A有两个组。 我希望避免FOR循环,因为数据帧有数千万行。


解决方案

按组比较shiftedSTART列创建帮助器Series并将其用于groupby

s = df.loc[df.groupby('KEY')['START'].shift(-1) == df['END'], 'END']
s = s.combine_first(df['START'])
print (s)
0   2017-01-01
1   2017-01-23
2   2017-01-23
3   2017-02-02
4   2017-02-02
Name: END, dtype: datetime64[ns]

df = df.groupby(['KEY', s], as_index=False).agg({'START':'first','END':'last','VALUE':'sum'})
print (df)
  KEY  VALUE      START        END
0   A    2.1 2017-01-01 2017-01-16
1   A    5.0 2017-01-28 2017-03-01
2   B    6.0 2017-01-01 2017-02-10

相关文章