我有一个类似以下的数据框(以下数据经过简化以提供一个最小的示例):
df =
item state startTime endTime
A 1 2019-05-01 04:30:00 2019-05-02 04:30:00
A 1 2019-05-02 04:30:00 2019-05-04 04:30:00
A 1 2019-05-04 04:30:00 2019-05-10 04:30:00
A 2 2019-05-10 04:30:00 2019-05-12 04:30:00
A 2 2019-05-12 04:30:00 2019-05-13 04:30:00
A 1 2019-05-13 04:30:00 2019-05-25 04:30:00
其中项A从2019-05-01 04:30:00到2019-05-10 04:30:00处于状态1,然后从2019-05-10 04:30:00到2019处于状态2 -05-13 04:30:00,然后从2019-05-13 04:30:00到2019-05-25 04:30:00返回状态1。
我试图简化数据帧,使其只有3行提供相同的信息,使用从第一次出现状态开始的startTime,然后对于最后一次出现该状态的endTime,然后切换到新状态,使用endTime。
这是我要去的结果:
df =
item state startTime endTime
A 1 2019-05-01 04:30:00 2019-05-10 04:30:00
A 2 2019-05-10 04:30:00 2019-05-13 04:30:00
A 1 2019-05-13 04:30:00 2019-05-25 04:30:00
我要处理的实际数据帧可能长数千行,因此我希望能够快速进行此操作。希望有人可以指引我正确的方向或建议我要寻找的熊猫手术吗?我对熊猫不是那么陌生,但是不知道如何解决这个问题,并希望避免在这里重新发明轮子……
在此先感谢您的帮助。
答案 0 :(得分:0)
您可以使用diff
和cumsum
创建groupby
键,然后再进行
d={'item':'first','state':'first','startTime':'min','endTime':'max'}
df.groupby([df.item,df.state.diff().ne(0).cumsum()]).agg(d)