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

Pandas如何基于另一DataFrame仅更新主表发生值变更的对应记录

方案解答

你的预设实现思路逻辑通顺,是合理的,以下是完整实现代码:

完整实现

import pandas as pd

# 原始数据(注:你示例中df_output的19860对应Price_Now代码笔误写为249.99,注释标注为259.99,以下代码以实际更新逻辑为准做了修正)
df_master = pd.DataFrame({'Reference_Code':['19860', '20220'],
        'Price_Now':[249.99, 149.99],
        'Price_Was':['',159.99],
        'In_Stock':['',''],
        'Updated':['',''],        
            })

df_output = pd.DataFrame({'Reference_Code':['19860', '20220', '52458','12546'], 
                          'Price_Now':[259.99, 149.99, 12.99, 19.99], 
                          'Price_Was':['',159.99,'',''], 
                          'Updated':['30/10/2021','','',''],
                         })

# 你预设的日期变量
todaysdate = "30/10/2021"

# 步骤1:匹配相同Reference_Code的记录
code1 = list(df_master['Reference_Code'])
df_match = df_output.loc[df_output['Reference_Code'].isin(code1)]

# 步骤2:筛选Price_Now发生变化的记录,round(2)避免浮点数精度问题导致的比较错误
df_master_idx = df_master.set_index('Reference_Code')
df_match_idx = df_match.set_index('Reference_Code')
diff_mask = ~df_match_idx['Price_Now'].round(2).eq(df_master_idx['Price_Now'].round(2))
df_update = df_match_idx.loc[diff_mask].reset_index()

# 步骤3+4:批量更新df_master对应字段,向量化实现无需循环
price_map = df_update.set_index('Reference_Code')['Price_Now']
update_map = df_update.set_index('Reference_Code').assign(Updated=todaysdate)['Updated']

df_master['Price_Now'] = df_master['Reference_Code'].map(price_map).fillna(df_master['Price_Now'])
df_master['Updated'] = df_master['Reference_Code'].map(update_map).fillna(df_master['Updated'])

# 若要和你给出的最终示例结果对齐,删除不需要的In_Stock字段
df_master = df_master.drop(columns=['In_Stock'])

运行后输出的df_master即可得到你需要的目标结果。

内容的提问来源于stack exchange,提问作者in_d

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 08:36:03