如何基于ID匹配与日期条件用Pandas更新主DataFrame
Pandas 按条件匹配并更新主表数据
现有两个Pandas DataFrame:df_master(主表)和df_updt(更新表),需实现以下操作:
- 当主表的
Id与更新表的org_id匹配,且主表的dt_id小于更新表的cal_id时,用更新表的A、B、C列更新主表对应列; - 若同一ID存在多条符合条件的更新记录,需选取
cal_id最新的那条。
示例代码
import pandas as pd master_tb = { 'Id' : ['A1','A2','A3','A4','A5','A6','A7'], 'dt_id' : [20230130,20230104,20230130,20230130,20230130,20230130,20230130], 'A' : [0,3,4,2,9,8,7], 'B' : [5,8,3,1,6,4,2], 'C' : [5,2,6,8,8,8,7] } updt_tb = { 'cal_Id' : [20230103,20230215,20230104,20230104,20230504], 'org_id' : ['A2','A2','A5','A9','A5'], 'A' : [30,80,100,100,80], 'B' : [0,10,90,40,40], 'R' : [0,100,50,60,80], 'C' : [30,10,50,40,80], 'T' : [90,50,50,40,30] } # 创建DataFrame对象 df_master = pd.DataFrame(master_tb) df_updt = pd.DataFrame(updt_tb)
期望输出
Id dt_id A B C A1 20230130 0 5 5 A2 20230104 80 10 10 A3 20230130 4 3 6 A4 20230130 2 1 8 A5 20230130 80 40 80 A6 20230130 8 4 8 A7 20230130 7 2 7
解决方案
实现步骤
- 预处理更新表:按
org_id分组,保留每个org_id中cal_Id最大的记录,只保留更新所需的列; - 关联主表与更新表:通过
Id和org_id做左关联,保留主表所有记录的同时匹配更新数据; - 条件筛选并更新:筛选出主表
dt_id小于更新表cal_Id的行,用更新表的A、B、C列覆盖主表对应列。
完整代码
import pandas as pd # 1. 预处理更新表:保留每个org_id对应的最新cal_Id记录 df_updt_processed = df_updt.sort_values(by=['org_id', 'cal_Id'], ascending=[True, False]) \ .groupby('org_id').first() \ .reset_index()[['org_id', 'cal_Id', 'A', 'B', 'C']] # 2. 关联主表与处理后的更新表 merged = df_master.merge(df_updt_processed, left_on='Id', right_on='org_id', how='left') # 3. 筛选符合条件的行并更新主表数据 update_mask = merged['dt_id'] < merged['cal_Id'] df_master.loc[update_mask, ['A', 'B', 'C']] = merged.loc[update_mask, ['A_y', 'B_y', 'C_y']].values # 打印结果 print(df_master)
代码说明
- 排序后分组取第一条,确保每个
org_id仅保留最新的更新记录; - 左关联保证主表所有记录不丢失,同时匹配到对应的更新数据;
- 布尔索引
update_mask精准筛选需要更新的行,避免误更新不符合条件的记录。
内容的提问来源于stack exchange,提问作者Zasm
相关产品推荐
相关产品推荐

