Pandas如何基于相似行匹配,将df1的tax列值同步更新到df2
实现方案
你可以通过多列构建匹配映射的方式实现替换,逻辑简洁且性能较好:
import pandas as pd # 测试数据 Names = ['Albert', 'John', 'jac', 'joe', 'peter'] Rs = [486, 2300, 3999, 334, 34] demand = [785, 30, 70, 780, 366] tax = [545, 40, 20, 10, 10] df1 = pd.DataFrame({'Names':Names, 'Rs':Rs, 'demand':demand, 'tax':tax}) Names = ['sanjay', 'sunil', 'peter', 'shweta', 'John'] Rs = [4562, 7896, 34, 78, 2300] demand = [7895, 7822, 366, 785, 30] tax = [1231, 89, 16, 12, 89] df2 = pd.DataFrame({'Names':Names, 'Rs':Rs, 'demand':demand, 'tax':tax}) # 核心替换逻辑 # 以Names、Rs、demand三个列为键,构建df1的tax映射表 tax_mapper = df1.set_index(['Names', 'Rs', 'demand'])['tax'] # 对df2的对应键做匹配,匹配到的替换为df1的tax,未匹配到的保留原值 df2['tax'] = df2.set_index(['Names', 'Rs', 'demand']).index.map(tax_mapper).fillna(df2['tax']).astype(int)
执行后df2的输出结果为:
| Names | Rs | demand | tax |
|---|---|---|---|
| sanjay | 4562 | 7895 | 1231 |
| sunil | 7896 | 7822 | 89 |
| peter | 34 | 366 | 10 |
| shweta | 78 | 785 | 12 |
| John | 2300 | 30 | 40 |
注意事项
如果实际数据中姓名字段存在大小写不一致的问题(比如df1存的是peter、df2存的是Peter),可以先统一字段大小写再执行替换逻辑:
df1['Names'] = df1['Names'].str.lower() df2['Names'] = df2['Names'].str.lower()
内容的提问来源于stack exchange,提问作者Sticky
相关产品推荐
相关产品推荐

