You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)

关键说明

  1. 原代码的fillna(0)未生效,是因为缺少to_excel步骤——修改后的DataFrame仅存在内存中,未持久化到磁盘。
  2. 方案一通过字典查找替代嵌套循环,大幅提升数据匹配效率;同时在赋值阶段直接处理空白值,无需后续二次处理。
  3. 方案二更适合数据量较大的场景,Pandas的向量操作比openpyxl逐行循环效率高得多。

内容的提问来源于stack exchange,提问作者JoeCastro

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 21:15:32