如何在pandas中按时间序列进行分组并聚合开始/停止时间

3

我有一个长这样的数据框:

       data  start  stop
    10    1.0   1.5
    10    2.0   2.5
    10    3.0   3.5
    10    4.0   4.5
    10    5.0   5.5
    10    6.0   6.5
    10    7.0   7.5
    10    8.0   8.5
    14    9.0   9.5
    14   10.0  10.5
    10   11.0  11.5
    10   12.0  12.5
    10   13.0  13.5
    10   14.0  14.5
    14   15.0  15.5
    10   16.0  16.5
    10   17.0  17.5
    11   18.0  18.5
    11   19.0  19.5
    11   20.0  20.5

我希望按照 df.data 进行分组,并将 df.start 和 df.stop 的时间汇总到对应的列中。结果应该如下所示:

    data  start  stop
    10    1.0   8.5
    14    9.0   10.5
    10   11.0   14.5
    14   15.0   15.5
    10   16.0   17.5
    11   18.0   20.5

1个回答

5
你可以使用 ne + shift + cumsum 来按连续值分组。然后选择每列的适当聚合方式。考虑到数据的顺序,你也可以使用 'first''last' 分别聚合开始和结束。
d = {'data': 'first', 'start': 'min', 'stop': 'max'}   # How to aggregate
s = df.data.ne(df.data.shift(1)).cumsum().rename(None) # How to group

df.groupby(s).agg(d)
#   data  start  stop
#1    10    1.0   8.5
#2    14    9.0  10.5
#3    10   11.0  14.5
#4    14   15.0  15.5
#5    10   16.0  17.5
#6    11   18.0  20.5

3
看起来可以使用'start':'first', 'stop':'last',这样可以省去一些比较 :-) - Quang Hoang
df.groupby((df.data!=df.data.shift()).cumsum()).agg({'data':'first', 'start':'first', 'stop':'last'}).set_index('data') 这段代码同样有效。 - oppressionslayer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接