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

使用pandas与numpy比对Excel工作表仅返回差异行的实现问题

问题背景

我编写了一个脚本,将Excel文件的Sheet1、Sheet2两个工作表读取为DataFrame(df1、df2),原本会在名为Results的工作表中输出标注了两表差异的更新后df1。目前我需要调整逻辑,仅返回两个工作表中存在差异的行。

原始代码
import pandas as pd
import numpy as np

filename = 'SAMPLE FILE.xlsx'

df1 = pd.read_excel(filename, 'Sheet1')
df2 = pd.read_excel(filename, 'Sheet2')

writer = pd.ExcelWriter(filename, engine = 'xlsxwriter')
df1.to_excel(writer, sheet_name = 'Sheet1',index=False,header=True)
df2.to_excel(writer, sheet_name = 'Sheet2',index=False,header=True)


rows, cols = np.where(np.not_equal(df1, df2))

df3 = pd.DataFrame()

for cell in zip(rows, cols):
    df1.iloc[cell[0], cell[1]] = ' {} -> {} '.format(df1.iloc[cell[0], cell[1]], df2.iloc[cell[0], cell[1]])
    df3 = df3.append(df1.iloc[cell[0]])[df1.columns]

df3.to_excel(writer,sheet_name='Results', index=False, header=True)
writer.save()
原始代码问题
  • 若单行存在多个差异单元格,会重复追加同一行多次,导致结果表出现重复行
  • 使用的append方法已在pandas 1.4版本后弃用,运行时会抛出警告
  • 旧版本的writer.save()方法兼容性差,高版本pandas中已替换为writer.close()
修复后代码
import pandas as pd
import numpy as np

filename = 'SAMPLE FILE.xlsx'

df1 = pd.read_excel(filename, 'Sheet1')
df2 = pd.read_excel(filename, 'Sheet2')

writer = pd.ExcelWriter(filename, engine = 'xlsxwriter')
df1.to_excel(writer, sheet_name = 'Sheet1',index=False,header=True)
df2.to_excel(writer, sheet_name = 'Sheet2',index=False,header=True)

# 获取所有差异位置的行列索引
rows, cols = np.where(np.not_equal(df1, df2))
# 去重得到所有存在差异的行号,避免重复处理
diff_row_indexes = np.unique(rows)
diff_rows = []

for row_idx in diff_row_indexes:
    # 复制当前行原始数据
    temp_row = df1.iloc[row_idx].copy()
    # 筛选当前行所有差异列的索引
    diff_col_indexes = cols[rows == row_idx]
    # 标注所有差异单元格
    for col_idx in diff_col_indexes:
        temp_row.iloc[col_idx] = f' {temp_row.iloc[col_idx]} -> {df2.iloc[row_idx, col_idx]} '
    diff_rows.append(temp_row)

# 合并所有差异行生成结果表
df3 = pd.DataFrame(diff_rows, columns=df1.columns)

df3.to_excel(writer, sheet_name='Results', index=False, header=True)
writer.close()
可选调整

如果不需要标注单元格差异,仅需要输出原始的差异行,可直接用如下代码生成df3:

df3 = df1.loc[diff_row_indexes].copy()

如果需要同时输出两表的差异行进行对比,可以自行扩展拼接df1和df2的对应差异行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 08:18:03