匹配双数据集相同ID,筛选满足日期差<21天的最近日期记录并标记
数据集说明
df1(id唯一)
| id | date1 |
|---|---|
| 1 | 5/26/2022 |
| 2 | 9/15/2021 |
| 3 | 12/22/2021 |
| 5 | 1/19/2022 |
| 6 | 1/11/2022 |
df2(存在重复id)
| id | date2 |
|---|---|
| 3 | 5/10/2022 |
| 3 | 5/26/2022 |
| 4 | 11/28/2020 |
| 4 | 12/18/2021 |
| 5 | 1/19/2022 |
| 6 | 12/11/2021 |
| 6 | 1/13/2022 |
| 6 | 2/01/2022 |
| 7 | 12/08/2020 |
| 8 | 12/08/2020 |
处理需求
匹配两个数据集中的相同id,为每个匹配到的id选择df2中与df1的date1日期差最小的date2;若该日期差小于21天,new_col标记为1,否则标记为0。预期结果如下:
预期结果
| id | date1 | date2 | new_col |
|---|---|---|---|
| 3 | 12/22/2021 | 5/10/2022 | 0 |
| 5 | 1/19/2022 | 1/19/2022 | 1 |
| 6 | 1/11/2022 | 1/13/2022 | 1 |
解决方案(Python pandas实现)
import pandas as pd # 初始化数据集 df1 = pd.DataFrame({ 'id': [1,2,3,5,6], 'date1': ['5/26/2022','9/15/2021','12/22/2021','1/19/2022','1/11/2022'] }) df2 = pd.DataFrame({ 'id': [3,3,4,4,5,6,6,6,7,8], 'date2': ['5/10/2022','5/26/2022','11/28/2020','12/18/2021','1/19/2022','12/11/2021','1/13/2022','2/01/2022','12/08/2020','12/08/2020'] }) # 转换日期列为datetime类型 df1['date1'] = pd.to_datetime(df1['date1']) df2['date2'] = pd.to_datetime(df2['date2']) # 合并数据集,保留共同id的所有组合 merged = pd.merge(df1, df2, on='id', how='inner') # 计算日期差绝对值(单位:天) merged['date_diff'] = abs(merged['date1'] - merged['date2']).dt.days # 按id分组,筛选出每组日期差最小的行 result = merged.loc[merged.groupby('id')['date_diff'].idxmin()] # 生成new_col标记 result['new_col'] = (result['date_diff'] < 21).astype(int) # 整理输出列并格式化日期显示 result = result[['id', 'date1', 'date2', 'new_col']] result['date1'] = result['date1'].dt.strftime('%m/%d/%Y') result['date2'] = result['date2'].dt.strftime('%m/%d/%Y') print(result)
代码运行结果
| id | date1 | date2 | new_col |
|---|---|---|---|
| 3 | 12/22/2021 | 05/10/2022 | 0 |
| 5 | 01/19/2022 | 01/19/2022 | 1 |
| 6 | 01/11/2022 | 01/13/2022 | 1 |
内容的提问来源于stack exchange,提问作者Hasan
相关产品推荐
相关产品推荐

