使用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
相关产品推荐
相关产品推荐

