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

如何对比列数不同的Pandas DataFrame并提取差异数据

对比列数不同的Pandas DataFrame数据差异

直接上实操方案,用outer合并+列遍历的方式,精准捕获数据不匹配、单侧缺失的情况,输出符合预期的差异结果。

步骤1:构造示例数据

先模拟两个列数不同的DataFrame(实际非数值型数据同样适用):

import pandas as pd

# Prod环境数据(含ID、Name、Department、Salary列)
prod_df = pd.DataFrame({
    'ID': [1, 2, 3, 4],
    'Name': ['Alice', 'Bob', 'Charlie', 'David'],
    'Department': ['HR', 'Engineering', 'Finance', 'Engineering'],
    'Salary': [5000, 6000, 7000, 8000]
})

# Test环境数据(含ID、Name、Department、Position列,列数与Prod不同)
test_df = pd.DataFrame({
    'ID': [1, 2, 4, 5],
    'Name': ['Alice', 'Robert', 'David', 'Eve'],
    'Department': ['HR', 'Engineering', 'Marketing', 'Finance'],
    'Position': ['Manager', 'Developer', 'Analyst', 'Director']
})

步骤2:合并两个DataFrame

用outer连接方式保留所有键,添加后缀区分两个环境的数据:

merged = pd.merge(prod_df, test_df, on='ID', how='outer', suffixes=('_prod', '_test'))

步骤3:提取差异数据

遍历所有需要对比的列,分别处理列单侧存在和值不匹配的情况:

diff_results = []
# 获取所有需对比的列(排除ID键列)
prod_cols = [col for col in prod_df.columns if col != 'ID']
test_cols = [col for col in test_df.columns if col != 'ID']
all_cols = list(set(prod_cols + test_cols))

for col in all_cols:
    prod_col = f"{col}_prod"
    test_col = f"{col}_test"
    
    # 情况1:列只存在于Test环境
    if prod_col not in merged.columns:
        mask = merged[test_col].notna()
        diff_rows = merged.loc[mask, ['ID', test_col]].rename(columns={test_col: 'Test_Value'})
        diff_rows['Column'] = col
        diff_rows['Prod_Value'] = pd.NA
    # 情况2:列只存在于Prod环境
    elif test_col not in merged.columns:
        mask = merged[prod_col].notna()
        diff_rows = merged.loc[mask, ['ID', prod_col]].rename(columns={prod_col: 'Prod_Value'})
        diff_rows['Column'] = col
        diff_rows['Test_Value'] = pd.NA
    # 情况3:列在两个环境都存在,但值不匹配或单侧为空
    else:
        mask = (merged[prod_col] != merged[test_col]) | merged[prod_col].isna() | merged[test_col].isna()
        diff_rows = merged.loc[mask, ['ID', prod_col, test_col]].rename(columns={prod_col: 'Prod_Value', test_col: 'Test_Value'})
        diff_rows['Column'] = col
    
    diff_results.append(diff_rows)

# 合并所有差异结果并调整列顺序
final_diff = pd.concat(diff_results, ignore_index=True)
final_diff = final_diff[['ID', 'Column', 'Prod_Value', 'Test_Value']]

步骤4:查看差异结果

执行print(final_diff)会得到如下清晰的差异展示:

ID     Column Prod_Value Test_Value
0    2       Name        Bob     Robert
1    3       Name    Charlie       <NA>
2    5       Name       <NA>        Eve
3    4 Department Engineering  Marketing
4    3 Department    Finance       <NA>
5    5 Department       <NA>    Finance
6    3     Salary       7000       <NA>
7    1   Position       <NA>    Manager
8    2   Position       <NA>  Developer
9    4   Position       <NA>    Analyst
10   5   Position       <NA>   Director

关键说明

  • 用outer连接确保所有ID都被保留,不会遗漏单侧存在的键
  • 遍历列的方式自动适配列数不同的场景,无需手动指定对比列
  • 结果集中明确标注了差异所在的列、两个环境的对应值,不管是值不匹配还是单侧缺失都一目了然

内容的提问来源于stack exchange,提问作者Roger i

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 04:52:42