python - Pandas 数据框在时间范围内过滤行
问题描述
我有一个这样的数据框对象:
Date ID Delta
2019-10-16 16:43:46 BA9565P 0 days 00:00:00
2019-10-17 05:28:36 BA9565P 0 days 12:44:50
2019-10-16 16:43:13 BA9565X 0 days 00:00:00
2019-10-17 03:26:52 BA9565X 0 days 10:43:39
2019-10-10 19:17:17 BABRGNR 0 days 00:00:00
2019-10-12 19:43:56 BABRGNR 2 days 00:26:39
2019-10-31 00:48:52 BABRGR8 0 days 00:00:00
2019-11-01 14:33:41 BABRGR8 1 days 13:44:49
如果相同的ID在3天内,那么我只需要最新的结果。但是,如果同一个 ID 相隔超过 3 天,那么我想保留这两个记录。到目前为止,我已经做到了。
df2 = df[df.duplicated(['ID'], keep = False)][['Date', 'ID']]
df2["Date"] = pd.to_datetime(df2["Date"])
df2["Delta"] = df2.groupby(['ID']).diff()
df2["Delta"] = df2["Delta"].fillna(datetime.timedelta(seconds=0))
但是我不确定我应该如何继续。我努力了:
df2["Delta2"] = (df2["Delta"] < datetime.timedelta(days=3)
对于组的第一个元素,无论它们是否在 3 天内,条件都将为 True。
df2.groupby(['ID']).filter(lambda x: ((x["Delta"]<datetime.timedelta(days=3)) & \
(x["Delta"] != datetime.timedelta(seconds=0))).any())
同样,由于 .diff() 总是为第一个元素返回“NaT”,它也有类似的问题。有没有办法访问组的最后一个元素?还是有比使用 groupby().diff() 更好的方法?
解决方案
解决方案如果差异更像3 days
每个组,则选择所有组行,否则所有其他组的最后一行:
print (df)
Date ID Delta
0 2019-10-16 16:43:46 BA9565P 0 days 00:00:00
1 2019-10-17 05:28:36 BA9565P 0 days 12:44:50
2 2019-10-16 16:43:13 BA9565X 0 days 00:00:00
3 2019-10-20 03:26:52 BA9565X 0 days 10:43:39 <-chnaged data sample to 2019-10-20
4 2019-10-10 19:17:17 BABRGNR 0 days 00:00:00
5 2019-10-12 19:43:56 BABRGNR 2 days 00:26:39
6 2019-10-31 00:48:52 BABRGR8 0 days 00:00:00
7 2019-11-01 14:33:41 BABRGR8 1 days 13:44:49
#if not sorted dates
#df = df.sort_values(['ID','Date'])
df2 = df[df.duplicated(['ID'], keep = False)]
#get differences
df2["Delta"] = df2.groupby(['ID'])['Date'].diff().fillna(pd.Timedelta(0))
#compare by 3 days
mask = df2["Delta"] < pd.Timedelta(days=3)
#test if all Trues per groups
mask1 = mask.groupby(df2['ID']).transform('all')
#get last row per ID
mask2 = ~df2["ID"].duplicated(keep='last')
#filtering
df2 = df2[~mask1 | mask2]
print (df2)
Date ID Delta
1 2019-10-17 05:28:36 BA9565P 0 days 12:44:50
2 2019-10-16 16:43:13 BA9565X 0 days 00:00:00
3 2019-10-20 03:26:52 BA9565X 3 days 10:43:39
5 2019-10-12 19:43:56 BABRGNR 2 days 00:26:39
7 2019-11-01 14:33:41 BABRGR8 1 days 13:44:49
推荐阅读
- dart - Dart 抽象原语实现
- python - 如何通过查询结果进行迭代并将其发送到模板
- typescript - 打字稿:泛型函数可以使用类型变量吗?
- r - 为 Y 标签 ggplot R 设置颜色
- javascript - 如何使用 javascript 翻转 Webrtc 流?
- c++ - 可以将连续放置在内存中的变量视为数组的一部分吗?
- sql - 如何将 sqlite 文件中的 blob 数据读取为可读格式?
- ansible - 布尔值 true 或 false 的 Ansible 导入任务
- java - 嵌套泛型的 AspectJ 切入点?
- botframework - 网络聊天是否有可用的“重置”按钮?