Pandas两个超2万行数据框按日期区间条件关联的高效方案咨询
高效实现方案
核心思路是用向量化操作+分组聚合替代逐行遍历,执行效率可以提升数十倍,两万行数据耗时基本在1秒内,具体实现步骤如下:
- 把两个表的日期字段统一转换为pandas datetime格式,避免字符串比较出错
- 提前筛选DF2中
Delivered为True的记录,减少后续合并的数据量 - 按
Number字段左连接两个表 - 向量化判断日期是否落在区间内,按DF1的原索引分组聚合判断是否存在符合条件的记录,映射为Yes/No即可
import pandas as pd # 1. 统一转换日期格式 df1['From_Date'] = pd.to_datetime(df1['From_Date']) df1['To_Date'] = pd.to_datetime(df1['To_Date']) df2['Date'] = pd.to_datetime(df2['Date']) # 2. 筛选DF2中投递成功的有效记录 df2_valid = df2[df2['Delivered'] == True].copy() # 3. 按Number字段左连接两个表 merged = df1.reset_index().merge(df2_valid[['Number', 'Date']], on='Number', how='left') # 4. 向量化判断日期是否在区间内,按原DF1索引聚合判断匹配结果 merged['is_match'] = merged['Date'].between(merged['From_Date'], merged['To_Date']) match_result = merged.groupby('index')['is_match'].any().map({True: 'Yes', False: 'No'}) # 把结果赋值到DF1新增列 df1['Delivered'] = match_result
以上所有操作都是pandas底层C实现的向量化运算,没有Python层的循环开销,远快于apply或者手动遍历的方案,运行结果和你给出的预期输出完全一致。
内容的提问来源于stack exchange,提问作者Ajay saini
相关产品推荐
相关产品推荐

