
本文介绍如何在大规模数据集(百万级行、每组15–25行)中,基于 application_id 分组,高效判断每行的 rejected_time 是否等于同组内任意其他行的 selected_time,并生成布尔标记列 user_rejects。
本文介绍如何在大规模数据集(百万级行、每组15–25行)中,基于 `application_id` 分组,高效判断每行的 `rejected_time` 是否等于**同组内任意其他行**的 `selected_time`,并生成布尔标记列 `user_rejects`。
在真实业务场景(如信贷审批、招聘流程或订单履约系统)中,常需识别用户是否“先选后拒”——即某次拒绝操作的时间戳,恰好与同一申请(application_id)下另一次被选中的时间戳完全一致。该需求本质是组内跨行时间戳存在性匹配,而非简单自匹配(避免将本行 selected_time == rejected_time 误判),且对性能极为敏感(数据量达百万级,字段超百个)。
核心思路是:对每个 application_id 组,提取该组所有非空 selected_time 值构成集合,再逐行检查其 rejected_time 是否落在此集合中。关键在于避免显式循环或 apply 中嵌套遍历,而是利用向量化 isin() 实现 O(1) 查找。
以下是完整、可直接运行的解决方案:
import pandas as pd
import numpy as np
# 确保时间列正确解析为 datetime64[ns],自动处理空值/非法格式
time_cols = ['selected_time', 'rejected_time']
df[time_cols] = df[time_cols].apply(pd.to_datetime, errors='coerce')
# 定义组内匹配逻辑:当前组的 rejected_time 是否存在于本组非空 selected_time 中
def mark_user_rejects(group):
# 提取本组所有有效 selected_time(去重 + 去空),转为 Series 便于 isin
valid_selected = group['selected_time'].dropna().drop_duplicates()
# 向量化判断:每行 rejected_time 是否在 valid_selected 中
return group['rejected_time'].isin(valid_selected)
# 按 application_id 分组应用,禁用 group_keys 以提升性能(避免索引冗余)
df['user_rejects'] = (
df.groupby('application_id', group_keys=False)
.apply(mark_user_rejects)
.astype(int) # 转为 0/1 整数,节省内存且兼容下游计算
)
✅ 为什么高效?
- dropna() + drop_duplicates() 显著缩小查找集合规模(每组仅约1–3个有效 selected_time);
- isin() 底层基于哈希表,时间复杂度接近 O(n),远优于 any() 循环或 merge;
- group_keys=False 避免构造中间 MultiIndex,减少内存拷贝;
- astype(int) 替代 astype(bool) 可降低后续聚合/存储开销(尤其在 HDF5/Parquet 中)。
⚠️ 注意事项:
-
精度陷阱:若原始数据含微秒级差异(如 2023-12-20 05:32:26.691008 vs 2023-12-20 05:32:26.691010),isin() 默认严格匹配。如需容差匹配(如±1ms),应在 to_datetime 后统一截断精度:
df['selected_time'] = df['selected_time'].dt.floor('ms') df['rejected_time'] = df['rejected_time'].dt.floor('ms') - 空值处理:NaT 和空字符串 '' 均被 pd.to_datetime(..., errors='coerce') 转为 NaT,dropna() 自动排除,无需额外清洗;
- 内存优化:若内存受限,可改用 df.groupby(...).ngroup() + transform 配合字典缓存,但本方案在千万行内已足够稳定。
最终生成的 user_rejects 列严格满足业务定义:仅当某行 rejected_time 与同组内其他任意一行(非自身)的 selected_time 完全相等时为 1,否则为 0。该方法兼顾表达清晰性、执行效率与工程鲁棒性,适用于生产环境大规模时序关联分析。










