我有一张熊猫数据df的表格:
id start_time end_time label
1 0 2 A
1 3 6 C
1 9 11 A
2 0 4 B
2 5 7 A
3 1 10 C
3 20 22 A
3 22.5 24 A 我希望根据end_time(当前行)-start_time(上一行)<=阈值的条件按列id分组,然后在新的数据帧中将相应的时间和标签作为列表。实际上,对于阈值= 2,转换df之后的新数据应该如下所示:
id times labels
1 [(0,2), (3,6)] [A, C]
1 [(9,11)] [A]
2 [(0,4), (5,7)] [B, A]
3 [(1,10)] [C]
3 [(20,22), (22.5, 24)] [A, A] 实现这一目标的有效的、仿生的方法是什么?
生成示例df的代码:
df = pandas.DataFrame([[1,0, 2, 'A'],[1, 3,6,'C'],[1,9,11,'A'],[2,0,4,'B'],[2,5,7,'A'],[3,1,10,'C'],[3,20,22,'A'],[3,22.5,24,'A']],columns=['id', 'start_time', 'end_time', 'label'])发布于 2020-05-10 02:35:20
我们需要使用groupby和shift来创建子组键,然后我们只需使用agg完成groupby
s=df.groupby('id').apply(lambda x : (x.start_time-x.end_time.shift(1)).gt(1).cumsum()).reset_index(level=0,drop=True)
df['times']=list(zip(df.start_time,df.end_time))
df_out=df.groupby([df.id,s]).agg({'times':list,'label':list})
df_out
times label
id
1 0 [(0.0, 2), (3.0, 6)] [A, C]
1 [(9.0, 11)] [A]
2 0 [(0.0, 4), (5.0, 7)] [B, A]
3 0 [(1.0, 10)] [C]
1 [(20.0, 22), (22.5, 24)] [A, A]https://stackoverflow.com/questions/61706381
复制相似问题