You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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'])

优化编码方案

实现思路

  1. 对齐两个DataFrame的customer_id,确保对比的是同一客户的指标
  2. 提取所有需要对比的指标列(即df2中除customer_id外的列)
  3. 遍历每个指标列,对比df1和df2的对应值,生成差异掩码
  4. 利用掩码批量更新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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 15:35:29