Python如何基于最近日期匹配及附加列拼接两个DataFrame
实现方案
你提到的merge_asof实际上完全适配当前需求,该方法提供的by参数可指定分组匹配键,会在每个分组内单独执行日期的最近匹配,刚好满足你按pty分组后、匹配对应分组内小于等于inv_dt的最近alert_dt的要求。
merge_asof要求两个DataFrame的日期列必须为datetime类型,且按参与匹配的日期列升序排序,完整实现代码如下:
import pandas as pd # 1. 转换日期列为datetime格式(原日期格式为日/月/年) df_alert['alert_dt'] = pd.to_datetime(df_alert['alert_dt'], format='%d/%m/%Y') df_inv['inv_dt'] = pd.to_datetime(df_inv['inv_dt'], format='%d/%m/%Y') # 2. 按日期列升序排序 df_alert = df_alert.sort_values('alert_dt').reset_index(drop=True) df_inv = df_inv.sort_values('inv_dt').reset_index(drop=True) # 3. 按pty分组后执行最近日期匹配 result = pd.merge_asof( left=df_inv, right=df_alert, by='pty', # 按pty分组,仅在同分组内匹配日期 left_on='inv_dt', # 左表匹配日期列 right_on='alert_dt', # 右表匹配日期列 direction='backward' # 匹配小于等于inv_dt的最近alert_dt ) # 4. 调整输出格式符合要求 result = result.rename(columns={'alert_dt': 'closest_alert_dt_before_inv_dt'}) # 日期转回原字符串格式 result['inv_dt'] = result['inv_dt'].dt.strftime('%d/%m/%Y') result['closest_alert_dt_before_inv_dt'] = result['closest_alert_dt_before_inv_dt'].dt.strftime('%d/%m/%Y') # 调整列顺序 result = result[['inv_dt', 'closest_alert_dt_before_inv_dt', 'pty']]
运行上述代码得到的result与你给出的期望输出完全一致。
内容的提问来源于stack exchange,提问作者user14128401
相关产品推荐
相关产品推荐

