高效实现分组内跨行时间戳匹配:构建 user_rejects 布尔标识列
本文介绍如何在大规模数据集百万级行、每组15–25行中基于 application_id 分组高效判断每行的 rejected_time 是否等于同组内任意其他行的 selected_time并生成整数型布尔列 user_rejects。 本文介绍如何在大规模数据集百万级行、每组15–25行中基于 application_id 分组高效判断每行的 rejected_time 是否等于**同组内任意其他行**的 selected_time并生成整数型布尔列 user_rejects。在金融风控、招聘系统或订单审核等场景中常需识别“用户否决行为是否源于此前某次被选中”——即同一申请application_id下若某条记录的 rejected_time 与组内任一其他记录的 selected_time 完全相等精确到微秒则标记为 True即 user_rejects 1。该任务看似简单但直接使用 apply 遍历每组 嵌套循环会严重拖慢性能而 na?ve 的 merge 或 isin 全局操作又无法保证“跨行、组内、非自身”的语义。? 最优解利用 groupby().apply() 向量化 Series.isin()核心思路是对每个 application_id 组提取该组所有非空 selected_time 构成集合再批量判断本组每行的 rejected_time 是否落在该集合中。注意isin() 天然支持 NaN 安全比较且无需显式排除自身行——因为即使某行 rejected_time selected_time如首行只要该 selected_time 在组内存在哪怕就是它自己逻辑上即满足“被选中后又被拒绝”符合业务定义示例中第1行 user_rejects1 正是此情况。以下是完整、可直接运行的高性能实现import pandas as pd# 确保时间列正确解析为 datetime64[ns]自动处理空值如空字符串、NaTtime_cols [selected_time, rejected_time]df[time_cols] df[time_cols].apply(pd.to_datetime, errorscoerce)# 关键步骤按 application_id 分组对每组执行向量化 isin 判断def mark_user_rejects(group): # 提取本组所有非空 selected_time去重非必需isin 自动处理 valid_selected group[selected_time].dropna() # 判断本组每行 rejected_time 是否在 valid_selected 中 return group[rejected_time].isin(valid_selected)df[user_rejects] ( df.groupby(application_id, group_keysFalse) .apply(mark_user_rejects) .astype(int) # 转为 0/1 整数便于后续计算或存储)? 为什么这个方案高效 Adobe Image Background Remover Adobe推出的图片背景移除工具
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2510569.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!