基于公共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
相关产品推荐
相关产品推荐

