我有一个数据框的一部分,用于标识未与其他所有人(基本上是忘记挂断电话的人)同时断开连接的设备。我已经按UniqueCallID和LeaveTime对这个切片进行了排序,以便离群值始终是会议“组”中的最后一个离群值,并且如果差异大于x,我想将该离群值的LeaveTime更改为其前一个离场时间。时间(60分钟或1小时)。
我尝试了分组,但是datetime不允许我执行除count()之外的任何我理解的功能,而这对我没有太大帮助。我有一个UniqueCallID的列表,我想为该列表中的每个UniqueCallID都想要一个for循环,但是我不知道for循环中有什么。
我想比较每个UniqueCallID组的最后两行,并在时间上相距较远时采取行动。
这里是有关数据外观的一个概念。
data={'UniqueCallID':[1, 1, 1, 1, 2, 2, 2, 3,3], 'LeaveTime': ['2019-06-26 15:45:32','2019-06-26 15:45:34','2019-06-26 15:45:37','2019-06-27 04:30:33','2019-06-05 07:32:14','2019-06-05 07:33:16','2019-06-05 11:06:22','2019-06-21 15:42:37','2019-06-22 18:30:42']}
df=pd.DataFrame(data)
df
我希望索引值3的LeaveTime读为2019-06-26 15:45:37,与索引值2相同。真正的索引值与原始数据帧绑定在一起,我想我打算将两者合并,覆盖索引定位的行。
答案 0 :(得分:0)
我会这样:
df.groupby("UniqueCallID").apply(my_func,"delta")
其中delta是自第一次挂断以来的时间x(60分钟或1小时)之差;
delta = pd.Timedelta("60min")
我会这样写my_func:
def my_func(grouped,delta):
first_leave_time = grouped["LeaveTime"].min()
last_acceptable_leave_time = grouped.loc[grouped.LeaveTime<=first_leave_time+delta,"LeaveTime"].max()
grouped.loc[grouped.LeaveTime>first_leave_time+delta,"LeaveTime"]=last_acceptable_leave_time
return grouped
这是您得到的:
#Output
UniqueCallID LeaveTime
0 1 2019-06-26 15:45:32
1 1 2019-06-26 15:45:32
2 1 2019-06-26 15:45:32
3 1 2019-06-26 15:45:32
4 2 2019-06-05 07:32:14
5 2 2019-06-05 07:32:14
6 2 2019-06-05 07:32:14
7 3 2019-06-21 15:42:37
8 3 2019-06-21 15:42:37