Python中对比两个DataFrame列并更新对应日期列的优化实现
批量更新DataFrame中对应指标的变更日期
需求说明
现有两个DataFrame df1 和 df2,需仅更新df1中的变更日期列:当df2中某customer_id的指标列(如service_id_ind、nar_id_ind)与df1对应值不同时,将df1中该客户对应的变更日期列设置为today_date。实际场景包含约10个指标列,两个DataFrame各约500行。
示例数据
df1 初始数据
import pandas as pd dict_1 = {'customer_id': [1,2,3,4,5,6], 'service_id_ind': ['n','y','n','y','n','y'], 'service_ind_change_date':['1/1/2100','1/1/2100','1/1/2100','1/1/2100','1/1/2100','1/1/2100'], 'nar_id_ind':['n','n','n','n','n','n'], 'nar_id_ind_change_date':['1/1/2100','1/1/2100','1/1/2100','1/1/2100','1/1/2100','1/1/2100']} df1 = pd.DataFrame(dict_1, columns = ['customer_id','service_id_ind','service_ind_change_date','nar_id_ind','nar_id_ind_change_date'])
df2 对比数据
dict_2 = {'customer_id': [1,2,3,4,5,6], 'service_id_ind': ['n','y','y','y','n','n'], 'nar_id_ind':['n','y','y','y','y','y']} df2 = pd.DataFrame(dict_2, columns = ['customer_id','service_id_ind','nar_id_ind'])
期望输出
dict_output = {'customer_id': [1,2,3,4,5,6], 'service_id_ind': ['n','y','n','y','n','y'], 'service_ind_change_date':['1/1/2100','1/1/2100','today_date','1/1/2100','1/1/2100','today_date'], 'nar_id_ind':['n','n','n','n','n','n'], 'nar_id_ind_change_date':['1/1/2100','today_date','today_date','today_date','today_date','today_date']} df1_output = pd.DataFrame(dict_output, columns = ['customer_id','service_id_ind','service_ind_change_date','nar_id_ind','nar_id_ind_change_date'])
优化编码方案
实现思路
- 对齐两个DataFrame的
customer_id,确保对比的是同一客户的指标 - 提取所有需要对比的指标列(即
df2中除customer_id外的列) - 遍历每个指标列,对比
df1和df2的对应值,生成差异掩码 - 利用掩码批量更新
df1中对应的变更日期列
代码实现
import pandas as pd # 定义今天的日期(可根据实际需求替换,比如pd.Timestamp.today().strftime('%m/%d/%Y')) today_date = 'today_date' # 提取所有需要对比的指标列(df2中除customer_id外的列) indicator_cols = df2.columns.drop('customer_id').tolist() # 对齐两个DataFrame的customer_id,确保顺序一致 df2_aligned = df2.set_index('customer_id').reindex(df1['customer_id']).reset_index() # 遍历每个指标列,更新对应的变更日期 for col in indicator_cols: # 生成差异掩码:df1和df2对应指标值不同的行 mask = df1[col] != df2_aligned[col] # 构造对应的变更日期列名 date_col = f"{col}_change_date" # 批量更新变更日期 df1.loc[mask, date_col] = today_date # 查看结果 print(df1)
方案优势
- 可扩展性强:新增指标列时无需修改核心逻辑,只需保证
df2中新增的指标列对应df1中有{指标列名}_change_date的日期列即可 - 高效批量处理:利用Pandas的向量运算和掩码机制,避免逐行循环,处理500行数据性能优异
- 逻辑清晰:通过对齐索引确保对比的准确性,遍历指标列的方式直观易懂
内容的提问来源于stack exchange,提问作者rabasa97
相关产品推荐
相关产品推荐

