Python处理Excel空白单元格替换为0的代码问题求助
问题分析与解决方案
你的代码中fillna(0)未生效的核心原因是仅修改了内存中的DataFrame,但未将修改后的数据写回Excel文件。另外,嵌套循环匹配数据的效率极低,且在使用openpyxl赋值时未处理Source中Count列的空白值。
方案一:优化原openpyxl代码(直接处理空白值)
将Source的数据转为字典避免嵌套循环,同时在赋值时直接把空白值替换为0:
import openpyxl # 加载工作簿 daily_wb = openpyxl.load_workbook('C:/Test.xlsx') master_wb = openpyxl.load_workbook('C:/Source.xlsx') daily_sheet = daily_wb['WorkSheet'] master_sheet = master_wb['WorkSheet'] # 将Source的A列和Count列转为字典,空白值直接设为0 master_data = {} for row in master_sheet.iter_rows(min_row=2): # 假设第一行是表头 key = row[0].value count_val = row[1].value master_data[key] = count_val if count_val is not None else 0 # 遍历Test的行,匹配赋值 for row in daily_sheet.iter_rows(min_row=2): col_a_value = row[0].value row_num = row[0].row # 匹配不到的情况也可以设为0,按需调整 daily_sheet.cell(row=row_num, column=6).value = master_data.get(col_a_value, 0) # 保存修改后的文件 daily_wb.save('C:/Test.xlsx')
方案二:纯Pandas实现(高效简洁)
利用Pandas的映射功能替代循环,代码更简洁且处理效率更高:
import pandas as pd # 读取两个表格数据 daily_df = pd.read_excel('C:/Test.xlsx', sheet_name='WorkSheet') master_df = pd.read_excel('C:/Source.xlsx', sheet_name='WorkSheet') # 处理Source中的空白Count值为0,构建A列到Count列的映射 master_df['Count'] = master_df['Count'].fillna(0) count_map = master_df.set_index('A')['Count'] # 为Test匹配Count值,无匹配项设为0 daily_df['Count'] = daily_df['A'].map(count_map).fillna(0) # 将结果写回Excel daily_df.to_excel('C:/Test.xlsx', index=False)
关键说明
- 原代码的
fillna(0)未生效,是因为缺少to_excel步骤——修改后的DataFrame仅存在内存中,未持久化到磁盘。 - 方案一通过字典查找替代嵌套循环,大幅提升数据匹配效率;同时在赋值阶段直接处理空白值,无需后续二次处理。
- 方案二更适合数据量较大的场景,Pandas的向量操作比openpyxl逐行循环效率高得多。
内容的提问来源于stack exchange,提问作者JoeCastro
相关产品推荐
相关产品推荐

