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

Python实现基于指定列的新旧数据库DataFrame对比报表生成

批量生成DataFrame指定列的新旧数据对比报表方案

核心实现步骤

基于pandas完成自动化对比,流程如下:

  1. 从单行的df3中解析出待分析的列名列表
  2. 以ID为关联键合并新旧数据库的DataFrame
  3. 遍历待分析列,批量生成对应列的新旧对比报表

代码示例

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 21:55:36