Python脚本实现两Excel表格signals匹配填充new_name列问题排查
问题排查与修正:基于Pandas的Excel信号名称匹配脚本
需求说明
现有两个Excel表格:
- Table1:包含
signals(信号长名称)列和new_name(信号短名称)列 - Table2:仅包含
signals列
需要实现逻辑:为Table2新增new_name列,若Table2的signals值在Table1中存在,则对应填充Table1的new_name值;不存在则填充-。
原代码问题分析
你写的代码存在以下几个关键问题:
- 嵌套循环效率低下:两层for循环遍历数据,当表格行数较多时(比如Table2有几百行),运行速度会极慢,不符合Pandas的高效处理原则
- 硬编码列索引:用
iat[i,3]、iat[i,22]固定列位置,若表格列顺序调整,代码直接失效,应该用列名访问数据 - 循环逻辑错误:外层循环每遍历一行Table1数据,就会重新覆盖所有Table2行的结果,最终只有最后一次匹配的结果会保留,之前的正确匹配会被错误覆盖为
- - 未完成结果写入:仅将结果存到字典
arr,没有写回DataFrame,也未执行保存Excel的操作
修正后的代码
import pandas as pd def open_xlsx(_file_dir): # 读取Excel,用列名访问,避免索引依赖 df = pd.read_excel(_file_dir, engine="openpyxl") df.fillna('', inplace=True) return df # 读取两个表格 table1 = open_xlsx(r"Table1.xlsx") table2 = open_xlsx(r"Table2.xlsx") # 构建signals到new_name的映射字典 signal_map = table1.set_index('signals')['new_name'].to_dict() # 为Table2新增new_name列,匹配不到则填充'-' table2['new_name'] = table2['signals'].map(signal_map).fillna('-') # 保存结果到Excel(建议存为新文件避免覆盖原数据,需覆盖可修改路径) table2.to_excel(r"Table2_updated.xlsx", index=False)
代码说明
- 列名访问数据:全程用
signals、new_name列名操作,避免索引硬编码的脆弱性 - 映射字典+map函数:用Pandas内置的
map实现高效匹配,比嵌套循环效率提升几个数量级 - 结果填充与保存:用
fillna('-')处理未匹配的情况,最后直接将更新后的DataFrame保存为新Excel文件
内容的提问来源于stack exchange,提问作者Камаль
相关产品推荐
相关产品推荐

