Python中无需循环实现双条件VLOOKUP及DataFrame数据更新
基于多列匹配的DataFrame值填充与更新方案
需求说明
我有一个包含14列的大型DataFrame(df1),需基于A、B两列的匹配条件,将另一个长度不同的DataFrame(df2)中的C列值添加到df1的新列中,要求禁止使用for循环。后续需将生成的df3导出再重新导入,并用df4中的值更新df3的C列。
示例数据
df1
| A | B | |
|---|---|---|
| 0 | 1 | a |
| 1 | 1 | b |
| 2 | 1 | c |
| 3 | 2 | a |
| 4 | 2 | b |
| 5 | 2 | c |
df2
| A | B | C | |
|---|---|---|---|
| 0 | 1 | a | S |
| 1 | 1 | b | E |
| 2 | 1 | c | E |
df4
| A | B | C | |
|---|---|---|---|
| 0 | 2 | a | S |
| 1 | 2 | b | E |
| 2 | 2 | c | S |
解决方案
步骤1:从df2匹配填充生成df3
使用Pandas的merge方法进行左连接,基于A、B两列匹配,自动填充C列,无匹配项则为NaN,全程矢量化操作,效率远高于循环。
import pandas as pd # 构建示例DataFrame(实际使用时替换为你的数据) df1 = pd.DataFrame({'A': [1,1,1,2,2,2], 'B': ['a','b','c','a','b','c']}) df2 = pd.DataFrame({'A': [1,1,1], 'B': ['a','b','c'], 'C': ['S','E','E']}) # 左连接匹配,生成df3 df3 = df1.merge(df2, on=['A', 'B'], how='left')
生成的df3结果:
| A | B | C | |
|---|---|---|---|
| 0 | 1 | a | S |
| 1 | 1 | b | E |
| 2 | 1 | c | E |
| 3 | 2 | a | NaN |
| 4 | 2 | b | NaN |
| 5 | 2 | c | NaN |
步骤2:导出导入后用df4更新df3的C列
先完成导出/导入操作,再用combine_first方法,优先保留df3原有的非空值,用df4的值填充空值。
# 导出df3到文件 df3.to_csv('df3.csv', index=False) # 重新导入df3 df3 = pd.read_csv('df3.csv') # 构建示例df4(实际使用时替换为你的数据) df4 = pd.DataFrame({'A': [2,2,2], 'B': ['a','b','c'], 'C': ['S','E','S']}) # 将df4转换为以A、B为索引的Series,用于匹配更新 update_values = df4.set_index(['A', 'B'])['C'] # 更新df3的C列 df3['C'] = df3.set_index(['A', 'B'])['C'].combine_first(update_values).reset_index(drop=True)
更新后的df3结果:
| A | B | C | |
|---|---|---|---|
| 0 | 1 | a | S |
| 1 | 1 | b | E |
| 2 | 1 | c | E |
| 3 | 2 | a | S |
| 4 | 2 | b | E |
| 5 | 2 | c | S |
内容的提问来源于stack exchange,提问作者MariaNaranjo
相关产品推荐
相关产品推荐

