Pandas 高效实现组内跨行时间戳匹配与布尔标记

本文介绍如何在大规模数据集(百万级行、每组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 pdimport numpy as np# 确保时间列正确解析为 datetime64ns,自动处理空值/非法格式time_cols = 'selected_time', 'rejected_time'dftime_cols = dftime_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 整数,节省内存且兼容下游计算)? 为什么高效? Cleanup.pictures 智能移除图片中的物体、文本、污迹、人物或任何不想要的东西

相关推荐
科技苑5 小时前
Python简单网络爬虫教程
爬虫·python
2501_933670796 小时前
2026秋招数据分析岗备考路线:SQL、BI、项目与面试题拆解
数据库
香吧香7 小时前
java服务异常日志只打印异常类型,没有堆栈定位分析
java·jvm·异常
Patrick在香港8 小时前
Claude Prompt 香港场景:公文里「今日」落在 6 个日历日上,「翌日」锚错了 5 天
python·自然语言处理·正则表达式·claude·数据清洗
我要见SA姐18 小时前
告别 Copilot?Codex 本地化部署指南
运维·数据库·机器学习·oracle·回归
程序员黎剑8 小时前
JVM-元空间溢出-OutOfMemoryError-Metaspace排查与解决
jvm
YsyaaabB9 小时前
Python 数值分析
python
阿洛学长9 小时前
计算机二级 Python 基本操作题(15 分)真题笔记(0101 ~ 1903 全套)
python·pycharm
xcLeigh9 小时前
聊聊国产化替换:好用数据迁移工具KDMS怎么帮咱们搞定评估难
数据库·sql·数据迁移·kes·kdms
Elastic 中国社区官方博客9 小时前
列式存储并不等同于列式数据库。Columnar 模式为 Elasticsearch 带来了什么
大数据·运维·数据库·elasticsearch·搜索引擎