如何在Pandas合并结果末尾添加Status列(基于列匹配判断)
Pandas合并表后添加Status匹配状态列的解决方案
完整修改代码
import pandas as pd import numpy as np class Excel: def __init__(self, src_file_name, src_sheet_name, src_pk, src_cols_to_compare, tgt_cols_to_compare, tgt_file_name, tgt_sheet_name, tgt_pk, target_excel): self.src_file_name = src_file_name self.src_sheet_name = src_sheet_name self.src_pk = src_pk self.src_cols_to_compare = src_cols_to_compare self.tgt_cols_to_compare = tgt_cols_to_compare self.tgt_file_name = tgt_file_name self.tgt_sheet_name = tgt_sheet_name self.tgt_pk = tgt_pk self.target_excel = target_excel def highlight_cells(self, row): styles = [''] * len(row) pk_cols = [col for col in row.index if col in [self.src_pk, self.tgt_pk]] for i, col in enumerate(row.index): if i % 2 == 1 and col not in pk_cols and col != 'Status': src_col = col tgt_col = row.index[i + 1] if row[src_col] == row[tgt_col]: styles[i], styles[i + 1] = 'background-color:lightgreen', 'background-color:lightgreen' elif pd.isnull(row[src_col]) or pd.isnull(row[tgt_col]): styles[i], styles[i + 1] = 'background-color: yellow', 'background-color: yellow' else: styles[i], styles[i + 1] = 'background-color:lightcoral', 'background-color:lightcoral' return styles def Read(self): src_df = pd.read_excel(self.src_file_name, sheet_name=self.src_sheet_name) tgt_df = pd.read_excel(self.tgt_file_name, sheet_name=self.tgt_sheet_name) result = src_df.merge(tgt_df, how='inner', left_on=self.src_pk, right_on=self.tgt_pk) result_columns = [self.src_pk] + [col for pair in zip(self.src_cols_to_compare, self.tgt_cols_to_compare) for col in pair] result = result[result_columns] # 核心:生成Status列 match_conditions = [] for src_col, tgt_col in zip(self.src_cols_to_compare, self.tgt_cols_to_compare): match_conditions.append(result[src_col] == result[tgt_col]) # 所有对比列都匹配才标记Pass,否则Fail result['Status'] = np.where(pd.concat(match_conditions, axis=1).all(axis=1), 'Pass', 'Fail') # 保存时包含Status列,去掉行索引 result.style.apply(self.highlight_cells, axis=1).to_excel(self.target_excel, index=False) comparator = Excel( src_file_name='source.xlsx', src_sheet_name='Sheet1', src_pk='ID', src_cols_to_compare=['Name', 'Salary'], tgt_cols_to_compare=['FirstName', 'Sal'], tgt_file_name='target.xlsx', tgt_sheet_name='Sheet1', tgt_pk='EMP_ID', target_excel='result.xlsx' ) comparator.Read()
关键修改说明
Status列生成逻辑:
- 遍历指定的对比列对,逐行生成布尔值判断是否匹配
- 通过
all(axis=1)校验当前行所有列对是否完全匹配 - 用
np.where根据校验结果批量赋值Pass或Fail
高亮函数适配:
- 在样式处理逻辑中排除
Status列,避免干扰原有列的高亮判断
- 在样式处理逻辑中排除
输出格式优化:
- 添加
index=False参数,避免输出带多余的行索引,与期望格式一致
- 添加
验证结果
运行代码后生成的Excel将完全符合期望输出:
ID | Name | FirstName | Salary | Sal |Status 1 | Sweta | Sweta | 1000 | 1000 |Pass 2 | Manish | Manish | 2000 | 3000 |Fail 3 | Priyanka | Priyanka | 3000 | 4000 |Fail
内容的提问来源于stack exchange,提问作者Sweta Rawani
相关产品推荐
相关产品推荐

