基于FMS_ID匹配与日期区间筛选的df1 code1字段更新需求
按日期区间匹配替换DataFrame字段值
初始数据(df1)
| FMS_ID | date | code1 |
|---|---|---|
| 18866 | 2022-01-01 | 3103 |
| 18866 | 2022-01-22 | 3103 |
| 18867 | 2022-10-23 | 3103 |
| 18867 | 2022-06-04 | 3103 |
匹配数据(df2)
| FMS_ID | Fdate | Tdate | code2 |
|---|---|---|---|
| 18866 | 2021-01-01 | 2022-01-21 | 1126 |
| 18866 | 2022-01-22 | 2022-11-01 | 8102 |
| 18867 | 2022-05-03 | 2022-08-01 | 3101 |
| 18867 | 2022-09-04 | 2022-11-01 | 1150 |
需求说明
当df1与df2的FMS_ID匹配,且df1的date处于df2对应的Fdate与Tdate区间内时,将df1的code1字段替换为df2的code2字段,最终输出更新后的df1。
预期输出
| FMS_ID | date | code1 |
|---|---|---|
| 18866 | 2022-01-01 | 1126 |
| 18866 | 2022-01-22 | 8102 |
| 18867 | 2022-10-23 | 1150 |
| 18867 | 2022-06-04 | 3101 |
实现方案
步骤1:转换日期列类型
先将所有日期列转为datetime类型,确保区间判断逻辑准确:
import pandas as pd df1['date'] = pd.to_datetime(df1['date']) df2['Fdate'] = pd.to_datetime(df2['Fdate']) df2['Tdate'] = pd.to_datetime(df2['Tdate'])
步骤2:匹配并替换字段
通过apply逐行匹配对应FMS_ID的日期区间,完成字段替换:
def update_code(row): # 筛选当前FMS_ID下,日期区间包含当前行date的记录 matched_record = df2[(df2['FMS_ID'] == row['FMS_ID']) & (df2['Fdate'] <= row['date']) & (df2['Tdate'] >= row['date'])] # 有匹配则返回code2,无匹配则保留原code1 return matched_record['code2'].iloc[0] if not matched_record.empty else row['code1'] # 批量更新code1字段 df1['code1'] = df1.apply(update_code, axis=1)
执行上述代码后,df1即可得到预期的更新结果。
内容的提问来源于stack exchange,提问作者user1465454
相关产品推荐
相关产品推荐

