使用Pandas实现source.xlsx与output.xlsx的多条件匹配取值
嘿,我刚好处理过类似的Excel数据匹配需求,给你整理了一个用Python Pandas实现的方案,完全贴合你的逻辑:
Excel数据匹配取值实现方案
匹配逻辑回顾
先再明确一遍核心规则,避免理解偏差:
- 优先用
source.xlsx的Caller ID匹配output.xlsx的svc_no - 若Caller ID为
NULL或第一轮无匹配结果,再用source.xlsx的adsl匹配output.xlsx的port - 无论哪种匹配成功,最终都将对应的Caller ID写入目标位置(忽略port字段)
准备工作
首先确保你安装了必要的依赖库,打开终端运行:
pip install pandas openpyxl
提示:
openpyxl是用来读写xlsx格式文件的引擎,必须安装
核心代码实现
import pandas as pd # 1. 读取两个Excel文件,统一用字符串类型避免格式匹配问题 source_df = pd.read_excel('source.xlsx', dtype=str) output_df = pd.read_excel('output.xlsx', dtype=str) # 2. 第一轮匹配:Caller ID 匹配 svc_no # 保留output的所有行,关联source中匹配的Caller ID和adsl merged_result = pd.merge( output_df, source_df[['Caller ID', 'adsl']], left_on='svc_no', right_on='Caller ID', how='left' ) # 3. 筛选需要二次匹配的行:Caller ID为NULL或未匹配到的记录 need_second_match = merged_result[ (merged_result['Caller ID'] == 'NULL') | merged_result['Caller ID'].isna() ].copy() # 4. 第二轮匹配:adsl 匹配 port,获取对应Caller ID second_match_data = pd.merge( need_second_match, source_df[['Caller ID', 'adsl']], left_on='port', right_on='adsl', how='left', suffixes=('_original', '_matched') ) # 更新Caller ID字段:用二次匹配结果替换原空值/NULL second_match_data['Caller ID'] = second_match_data['Caller ID_matched'].fillna(second_match_data['Caller ID_original']) # 把二次匹配的结果同步回总数据集 merged_result.update(second_match_data) # 5. 可选:把字符串'NULL'转换为Pandas空值,方便后续处理 merged_result['Caller ID'] = merged_result['Caller ID'].replace('NULL', pd.NA) # 6. 写入回output.xlsx(⚠️ 注意:会覆盖原文件,务必先备份!) merged_result.to_excel('output.xlsx', index=False, engine='openpyxl')
关键细节提示
- 用
dtype=str读取所有列:避免因为数值/字符串格式不一致导致匹配失败(比如Caller ID是数字但存成字符串,svc_no是数值类型,直接匹配会出错) - 两次匹配都用
how='left':确保output.xlsx的所有原有行都被保留,不会丢失任何数据 update方法:只更新需要修改的行,已经匹配成功的记录不会被改动- 备份原文件:写入前一定要复制一份
output.xlsx,避免误操作导致数据丢失
测试建议
可以先拿一小部分测试数据验证逻辑:
- 找几条Caller ID能匹配svc_no的记录,确认Caller ID正确写入
- 找几条Caller ID为NULL但adsl能匹配port的记录,确认对应Caller ID(哪怕是NULL)被正确写入
- 找两条都匹配不上的记录,确认保持原有状态不变
内容的提问来源于stack exchange,提问作者Ricky Aguilar
相关产品推荐
相关产品推荐

