Pandas如何高效判断同ID是否存在2个月内非重复日期行并新增布尔列
高效实现方案
针对需求,核心思路是利用Pandas的向量化运算替代嵌套循环,两种常用实现方式如下:
方法1:简洁可读版(适合万行以内数据)
直接通过分组+逐行判断实现,代码逻辑清晰易维护:
import pandas as pd # 第一步:确保日期列是datetime格式 df['datetime'] = pd.to_datetime(df['datetime']) # 第二步:按ID分组判断每行是否存在符合要求的同ID其他行 df['has_nearby'] = df.groupby('id')['datetime'].transform( lambda group: group.apply( lambda cur_date: ((group >= cur_date - pd.DateOffset(months=2)) & (group <= cur_date + pd.DateOffset(months=2)) & (group != cur_date)).any() ) )
方法2:高性能版(适合十万行以上大数据量)
利用排序后相邻行时间差最小的特性,仅对比相邻行即可完成判断,时间复杂度为O(n log n):
import pandas as pd # 第一步:确保日期列是datetime格式 df['datetime'] = pd.to_datetime(df['datetime']) # 第二步:按ID和日期排序,保留原始索引用于结果回贴 df_sorted = df.sort_values(['id', 'datetime']).reset_index(names='original_idx') # 第三步:计算同ID下当前行与上一行、下一行的时间差 df_sorted['diff_prev'] = df_sorted.groupby('id')['datetime'].diff() df_sorted['diff_next'] = df_sorted.groupby('id')['datetime'].diff(-1).abs() # 第四步:判断是否存在相邻行时间差小于2个月 df_sorted['has_nearby'] = (df_sorted['diff_prev'] < pd.DateOffset(months=2)) | (df_sorted['diff_next'] < pd.DateOffset(months=2)) # 第五步:将结果合并回原DataFrame df = df.merge( df_sorted[['original_idx', 'has_nearby']], left_index=True, right_on='original_idx' ).drop('original_idx', axis=1).reset_index(drop=True)
注意事项
- 时间差值计算使用
pd.DateOffset(months=2)而非固定60天,会自动适配不同月份的天数差异,符合常规业务对「2个月」的定义,若需求为固定60天可替换为pd.Timedelta(days=60)。 - 若原始数据的日期列已经是datetime64类型,可跳过格式转换步骤进一步提升性能。
内容的提问来源于stack exchange,提问作者gginelli
相关产品推荐
相关产品推荐

