如何对比列数不同的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
相关产品推荐
相关产品推荐

