如何用Python实现Vlookup并生成指定格式的匹配状态列
Python实现类似Excel Vlookup的ID匹配(标记OK/KO)
问题分析
你的现有代码存在几个关键问题:
- 导入了
numpy和openpyxl但未实际使用,无需保留; merge语句中on=['ID','ID']是错误写法,只需指定单个ID列;- 默认的内连接(inner join)会只保留两边都匹配的行,无法得到匹配失败的
KO结果; - 缺少生成
OK/KO标记的逻辑。
以下是两种符合需求的实现方案:
方案一:保留原表所有行,新增匹配结果列
此方案会保留A.xlsx的全部数据,新增一列显示匹配状态:
import pandas as pd # 文件路径 initial_workbook = 'A.xlsx' info_workbook = 'B.xlsx' output_workbook = 'outbook.xlsx' # 读取Excel文件 df_initial = pd.read_excel(initial_workbook) df_info = pd.read_excel(info_workbook) # 标准化A表列名(保持你的原有处理逻辑) df_initial.columns = (df_initial.columns.str.strip().str.upper() .str.replace(' ', '_') .str.replace('(', '') .str.replace(')', '')) # 提取B表中所有唯一ID,用于快速匹配 b_unique_ids = set(df_info['ID'].unique()) # 新增匹配结果列:ID存在于B表则标记OK,否则KO df_initial['Match_Result'] = df_initial['ID'].apply(lambda x: 'OK' if x in b_unique_ids else 'KO') # 输出结果到Excel df_initial.to_excel(output_workbook, index=False)
方案二:填充原表空的Status列
如果需要直接将匹配结果填入A.xlsx原本为空的Status列,可使用此方案:
import pandas as pd initial_workbook = 'A.xlsx' info_workbook = 'B.xlsx' output_workbook = 'outbook.xlsx' df_initial = pd.read_excel(initial_workbook) df_info = pd.read_excel(info_workbook) # 标准化列名 df_initial.columns = (df_initial.columns.str.strip().str.upper() .str.replace(' ', '_') .str.replace('(', '') .str.replace(')', '')) # 提取B表ID集合 b_unique_ids = set(df_info['ID'].unique()) # 填充Status列 df_initial['STATUS'] = df_initial['ID'].apply(lambda x: 'OK' if x in b_unique_ids else 'KO') # 输出结果 df_initial.to_excel(output_workbook, index=False)
补充说明
- 使用
set存储B表ID是为了提升匹配效率,尤其当数据量较大时,集合的查找速度远快于列表; - 如果需要同时关联B表中的其他字段(如
Date),可以改用左连接(how='left')的方式,通过_merge列判断匹配状态:
df_merged = pd.merge(df_initial, df_info, on='ID', how='left', indicator=True) df_initial['Match_Result'] = df_merged['_merge'].map({'both': 'OK', 'left_only': 'KO'})
内容的提问来源于stack exchange,提问作者weijia
相关产品推荐
相关产品推荐

