Python实现基于指定列的新旧数据库DataFrame对比报表生成
批量生成DataFrame指定列的新旧数据对比报表方案
核心实现步骤
基于pandas完成自动化对比,流程如下:
- 从单行的df3中解析出待分析的列名列表
- 以ID为关联键合并新旧数据库的DataFrame
- 遍历待分析列,批量生成对应列的新旧对比报表
代码示例
1. 准备示例数据
import pandas as pd # 旧数据库数据 df1 = pd.DataFrame({ 'Product': ['wheel 1', 'wheel 2'], 'ID': [123, 453], 'Risk': ['Negligible', 'High'], 'Damage': ['High', 'Low'] }) # 新数据库数据 df2 = pd.DataFrame({ 'ID': [123, 453], 'Risk': ['High', 'High'], 'Damage': ['Low', 'Law'] }) # 单行df3存储待分析列(示例为一行两列,分别对应Risk和Damage) df3 = pd.DataFrame([['Risk', 'Damage']], columns=['col1', 'col2'])
2. 提取待分析列
# 从df3中提取列名,扁平化后过滤空值 target_cols = df3.values.flatten().tolist() target_cols = [col for col in target_cols if pd.notna(col)]
3. 生成对比报表
# 合并新旧数据,自动添加后缀区分新旧列 merged_df = pd.merge( df1[['ID'] + target_cols], df2[['ID'] + target_cols], on='ID', suffixes=(' old (df1)', ' new (df2)') ) # 遍历生成单个列的对比报表 for col in target_cols: old_col_name = f"{col} old (df1)" new_col_name = f"{col} new (df2)" # 提取当前列的对比数据 compare_report = merged_df[['ID', old_col_name, new_col_name]] print(f"=== {col} 列新旧对比报表 ===") print(compare_report.to_markdown(index=False)) print("\n")
运行后输出示例:
=== Risk 列新旧对比报表 === | ID | Risk old (df1) | Risk new (df2) | |-----|----------------|----------------| | 123 | Negligible | High | | 453 | High | High | === Damage 列新旧对比报表 === | ID | Damage old (df1) | Damage new (df2) | |-----|------------------|------------------| | 123 | High | Low | | 453 | Low | Law |
优化思路
- 数据校验:合并时使用
how='outer'关联,标记仅存在于旧库/新库的ID,避免遗漏数据:merged_df = pd.merge( df1[['ID'] + target_cols], df2[['ID'] + target_cols], on='ID', suffixes=(' old (df1)', ' new (df2)'), how='outer', indicator=True ) merged_df['ID状态'] = merged_df['_merge'].map({ 'left_only': '仅旧库存在', 'right_only': '仅新库存在', 'both': '新旧库均存在' }) merged_df.drop('_merge', axis=1, inplace=True) - 批量导出:将各列对比报表导出到Excel的不同工作表,方便定期交付:
with pd.ExcelWriter('新旧数据对比汇总.xlsx') as writer: for col in target_cols: old_col_name = f"{col} old (df1)" new_col_name = f"{col} new (df2)" compare_report = merged_df[['ID', old_col_name, new_col_name]] compare_report.to_excel(writer, sheet_name=f"{col}对比", index=False) - 灵活适配df3格式:如果df3是单行单列(列名用逗号分隔),可调整提取逻辑:
# 示例df3为单行单列,值为"Risk, Damage" target_cols = df3.iloc[0,0].split(',') target_cols = [col.strip() for col in target_cols] - 性能优化:大数据量场景下,提前对df1、df2按ID排序,或关闭
merge的sort参数提升合并速度;重复执行任务时缓存合并后的merged_df,避免重复计算。
内容的提问来源于stack exchange,提问作者Andrew Pike
相关产品推荐
相关产品推荐

