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

如何在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()

关键修改说明

  1. Status列生成逻辑:

    • 遍历指定的对比列对,逐行生成布尔值判断是否匹配
    • 通过all(axis=1)校验当前行所有列对是否完全匹配
    • 用np.where根据校验结果批量赋值Pass或Fail
  2. 高亮函数适配:

    • 在样式处理逻辑中排除Status列,避免干扰原有列的高亮判断
  3. 输出格式优化:

    • 添加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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 04:00:54