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
相关产品推荐
相关产品推荐

