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

基于公共ID列对比两个DataFrame并将差异写入txt文件

两个DataFrame按ID对比差异输出指定格式TXT实现

核心逻辑为按共有ID列对齐两个DataFrame,逐行逐字段对比取值差异,自动排版后写入txt文件,兼容两个DataFrame行数不一致的场景。

  • 预处理阶段将ID列设为索引提升匹配效率,默认取两个DataFrame共有的ID做对比,可按需调整为包含单边存在的ID
  • 对比阶段跳过无差异的ID行,仅收集取值不一致的字段,分别标记来自df1的旧值、来自df2的新值
  • 输出阶段自动计算每列的显示宽度,保证表头和字段值排版对齐,和要求的示例格式完全一致

完整实现代码

import pandas as pd

def compare_df_export_diff(df1: pd.DataFrame, df2: pd.DataFrame, id_col: str = "ID", save_path: str = "diff_result.txt"):
    # 将ID列设为索引,方便按粒度匹配
    df1_indexed = df1.set_index(id_col)
    df2_indexed = df2.set_index(id_col)
    # 取两边共有的ID集合,若需要统计单边缺失的ID可在此处扩展ID集合
    match_ids = df1_indexed.index.intersection(df2_indexed.index)
    content_blocks = []

    for single_id in match_ids:
        row_old = df1_indexed.loc[single_id]
        row_new = df2_indexed.loc[single_id]
        # 收集当前ID下存在差异的字段
        diff_fields = []
        for col in df1_indexed.columns:
            # 对比时默认去除首尾空格,需要严格匹配可删除.strip()
            val_old = str(row_old[col]).strip()
            val_new = str(row_new[col]).strip()
            if val_old != val_new:
                diff_fields.append((col, val_old, val_new))
        # 无差异直接跳过
        if not diff_fields:
            continue
        # 按格式拼接当前ID的差异块
        block_lines = [f"ID : {single_id}"]
        header_parts = []
        value_parts = []
        # 计算列宽保证对齐
        for col, v_old, v_new in diff_fields:
            h_old = f"{col}_old"
            h_new = f"{col}_new"
            width_old = max(len(h_old), len(v_old))
            width_new = max(len(h_new), len(v_new))
            header_parts.extend([h_old.ljust(width_old), h_new.ljust(width_new)])
            value_parts.extend([v_old.ljust(width_old), v_new.ljust(width_new)])
        block_lines.append(" ".join(header_parts))
        block_lines.append(" ".join(value_parts))
        content_blocks.append("\n".join(block_lines))
    
    # 拼接所有差异块,块之间空一行
    final_content = "\n\n".join(content_blocks)
    # 写入txt文件
    with open(save_path, "w", encoding="utf-8") as f:
        f.write(final_content)

# 调用示例
if __name__ == "__main__":
    # 替换为你自己的df1、df2读取逻辑即可
    columns = ["ID", "Name", "Age", "Profession", "sex"]
    df1_data = [
        [1, "Tom", 20, "engineer", "M"],
        [2, "nick", 21, "doctor", "M"],
        [3, "krishi", 19, "lawyer", "F"],
        [4, "jacky", 18, "dentist", "F"]
    ]
    df2_data = [
        [1, "Tom", 20, "plumber", "M"],
        [2, "nick", 21, "doctor", "M"],
        [3, "krishi", 23, "Analyst", "F"],
        [4, "jacky", 18, "dentist", "F"]
    ]
    df1 = pd.DataFrame(df1_data, columns=columns)
    df2 = pd.DataFrame(df2_data, columns=columns)
    compare_df_export_diff(df1, df2)

自定义调整说明

  • 若需要把仅在单个DataFrame存在的ID也纳入输出,修改match_ids的取值逻辑,将单边ID加入集合即可,缺失侧的取值可自定义填充为不存在或NULL
  • 若不需要严格对齐排版,可删除列宽计算、ljust填充的逻辑,改用制表符\t分隔字段,输出更轻量化
  • 数值类型字段对比默认转字符串处理,若需要保留数值类型判断逻辑,可自行修改对比规则,避免字符串转换带来的格式误差

运行上述代码后,生成的diff_result.txt内容和需求给出的示例格式完全一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 06:54:31