在组内对比两行的时间戳

1 投票
1 回答
38 浏览
提问于 2025-04-14 17:30

我需要根据应用程序ID进行分组。然后,在每组中比较两条时间戳,并创建一个布尔值系列“user_rejects”。这个“user_rejects”应该表示在该组的其他行中,拒绝时间是否等于选定时间。

这个数据集有数百万行,超过100个变量,每个应用程序ID都有15到25行,所以效率很重要。

示例数据

应用程序ID ID 创建时间戳 选定时间 拒绝时间
69c0 7 2023-11-20 05:32:26.691008 2023-11-20 05:32:26.691008 2023-11-21 08:30:20.881008
69c0 15 2023-11-20 05:32:26.691008 NaT 2023-12-20 05:32:26.691008
69c0 14 2023-11-20 05:32:26.691008 NaT 2023-12-04 05:32:26.691008
69c0 9 2023-11-20 05:32:26.691008 NaT 2023-12-20 05:32:26.691010
69c0 18 2023-11-20 05:32:26.691008 NaT 2023-12-20 05:32:26.691011
69c0 6 2023-11-20 05:32:26.691008 2023-11-21 08:30:20.881008 NaT
69c0 19 2023-11-20 05:32:26.691008 NaT 2023-12-11 05:32:26.691008
db26 11 2023-08-01 10:40:48.473828 2023-08-01 10:40:48.473828
db26 12 2023-08-01 10:40:48.473828 2023-08-01 10:40:48.473828

期望的输出

应用程序ID ID 创建时间戳 选定时间 拒绝时间 用户拒绝
69c0 7 2023-11-20 05:32:26.691008 2023-11-20 05:32:26.691008 2023-11-21 08:30:20.881008 1
69c0 15 2023-11-20 05:32:26.691008 NaT 2023-12-20 05:32:26.691008 0
69c0 14 2023-11-20 05:32:26.691008 NaT 2023-12-04 05:32:26.691008 0
69c0 9 2023-11-20 05:32:26.691008 NaT 2023-12-20 05:32:26.691010 0
69c0 18 2023-11-20 05:32:26.691008 NaT 2023-12-20 05:32:26.691011 0
69c0 6 2023-11-20 05:32:26.691008 2023-11-21 08:30:20.881008 NaT 0
69c0 19 2023-11-20 05:32:26.691008 NaT 2023-12-11 05:32:26.691008 0
db26 11 2023-08-01 10:40:48.473828 2023-08-01 10:40:48.473828 0
db26 12 2023-08-01 10:40:48.473828 2023-08-01 10:40:48.473828 0

1 个回答

4

在第一步中,将列转换为日期时间格式,然后在每个组中使用Series.isin的lambda函数进行比较:

cols = ['selected_time','rejected_time']
df[cols] = df[cols].apply(pd.to_datetime, errors='coerce')

f = lambda x: x['rejected_time'].isin(x['selected_time'].dropna())
df['user_rejects'] = df.groupby('application_id', group_keys=False).apply(f).astype(int)

撰写回答