result =[]for uid, start, end in tmp.values:# 如果结果集中还没有数据或者当前记录的起始时间大于上一条记录的结束时间# 就可以直接将当前记录加入到结果集ifnot result or start > result[-1][2]:
result.append([uid, start, end])else:# 否则,说明可以将当前记录与上一条记录合并# 合并方法是如果当前记录的结束时间大于上一条记录的结束时间,# 则上一条记录的结束时间修改为当前记录的结束时间
result[-1][2]=max(result[-1][2], end)
tmp = pd.DataFrame(result, columns=["uid","start","end"])
tmp
结果:
uid
start
end
0
B
2
3
1
B
4
8
2
B
10
11
3
B
12
15
完整代码
然后我们整理一下完整的处理代码:
result =[]for uid, tmp in df.groupby("uid"):
tmp = tmp[["start","end"]].sort_values('start')
rows =[]for start, end in tmp.values:ifnot rows or start > rows[-1][2]:
rows.append([uid, start, end])else:
rows[-1][2]=max(rows[-1][2], end)
tmp = pd.DataFrame(rows, columns=["uid","start","end"])
result.append(tmp)
result = pd.concat(result)
result