如何用Pandas通过匹配列值,从另一个DataFrame更新目标DataFrame?
用第二个DataFrame覆盖更新第一个(基于Code和Name匹配)
没问题,我来帮你搞定这个需求!要实现以第二个DataFrame为数据源,根据Code和Name两列的匹配值更新第一个DataFrame的对应行,这里给你两种实用的方案,咱们先把示例数据补全,方便演示:
import pandas as pd # 待更新的第一个DataFrame data1 = { 'Code': [1, 2, 3], 'Name': ['Company1', 'Company2', 'Company3'], 'Value': [100, 200, 300] } df1 = pd.DataFrame(data1) # 作为覆盖源的第二个DataFrame data2 = { 'Code': [2], 'Name': ['Company2'], 'Value': [1000] } df2 = pd.DataFrame(data2)
方案一:复合索引 + update方法
这种方法直观高效,适合直接修改原DataFrame的场景:
# 把Code和Name设为复合索引,让两个DataFrame能精准匹配 df1.set_index(['Code', 'Name'], inplace=True) df2.set_index(['Code', 'Name'], inplace=True) # 用df2的内容覆盖更新df1中匹配的行 df1.update(df2) # 重置索引,恢复原来的列结构 df1.reset_index(inplace=True) print(df1)
运行后输出结果:
Code Name Value 0 1 Company1 100.0 1 2 Company2 1000.0 2 3 Company3 300.0
方案二:merge + combine_first方法
如果不想修改原DataFrame的索引,或者需要更灵活的处理逻辑,可以用这种方式生成新的更新后DataFrame:
# 左连接合并两个DataFrame,保留df1的所有行,匹配df2的内容 merged_df = df1.merge(df2, on=['Code', 'Name'], how='left', suffixes=('_old', '_new')) # 用df2的新值覆盖df1的旧值,没有匹配到新值的保留原数据 merged_df['Value'] = merged_df['Value_new'].combine_first(merged_df['Value_old']) # 筛选出需要的列,得到最终更新后的DataFrame updated_df = merged_df[['Code', 'Name', 'Value']] print(updated_df)
输出结果和方案一完全一致。
小提示
update方法会直接修改原DataFrame(如果使用inplace=True),而merge的方式会生成新的DataFrame,不会改动原始数据,你可以根据需求选择。- 如果需要把df2中不存在于df1的行也新增进去,只需要把merge的
how='left'改成how='outer'即可。
内容的提问来源于stack exchange,提问作者ProgSky
相关产品推荐
相关产品推荐

