我是python的新手。我有很多数据。我需要按时消除其中的一些。我有“第一个”和“最后一个”出现ID。示例ID_A首次出现在17:31:14,最后一次出现在17:31:25。
我的数据如下:
df
ID Time
ID_A 17:31:14
ID_A 17:31:25
ID_B 10:16:55
ID_B 15:50:15
ID_C 12:34:57
ID_C 12:41:07
ID_D 15:37:47
ID_D 15:37:56
ID_E 16:25:00
ID_E 18:37:13
ID_F 11:35:05
ID_F 11:40:15
我想根据时间消除ID。我认为删除ID的行数据的开始和结束时间少于2分钟且超过60分钟。消除之后,我想按时间值对ID进行排序。
我的预期结果如下:
ID Time
ID_F 11:35:05
ID_F 11:40:15
ID_C 12:34:57
ID_C 12:41:07
请帮助我。谢谢
答案 0 :(得分:2)
IIUC使用ptp
中的numpy
,然后在isin
之后使用between
import numpy as np
df.Time=pd.to_timedelta(df.Time)
s=df.groupby('ID')['Time'].apply(np.ptp).dt.total_seconds().between(2*60,90*60)
df_sub=df.loc[df.ID.isin(s[s].index)]
df_sub
Out[35]:
ID Time
4 ID_C 12:34:57
5 ID_C 12:41:07
10 ID_F 11:35:05
11 ID_F 11:40:15
现在让我们看一下排序部分,我正在使用transform
获取每个组ID的最小值,使用argsort
获取位置
df_sub=df_sub.iloc[df_sub.groupby('ID')['Time'].transform('min').argsort()]
Out[38]:
ID Time
10 ID_F 11:35:05
11 ID_F 11:40:15
4 ID_C 12:34:57
5 ID_C 12:41:07