Python中如何对比行列数不同的两个DataFrame的差异?
对比行列数不同的DataFrame差异(基于Pk列)
需求概述
需要对比两个行列数不同的DataFrame,两者均包含Pk列作为匹配键,且Schema预先未知。最终输出仅保留存在差异值的行和列的新DataFrame,遵循以下规则:
- 共同列中数据完全一致的行直接排除
- 仅在单个DataFrame中存在的列排除
- 所有行数据均一致的共同列排除
示例数据
预期DataFrame(df_expected)
| pk | column1 | amount1 | amount2 |
|---|---|---|---|
| 1 | A | 11 | 101 |
| 2 | B | 12 | 102 |
| 3 | C | 13 | 103 |
| 4 | D | 14 | 104 |
实际DataFrame(df_actual)
| pk | column1 | extra_column | amount1 | amount2 |
|---|---|---|---|---|
| 1 | A | AA | 11 | 101 |
| 2 | B | BB | 12 | 102 |
| 3 | C | CC | 13.1 | 103 |
| 4 | D | DD | 14 | 104.1 |
目标输出(df_output)
| pk | amount1 | amount2 |
|---|---|---|
| 3 | Actual: 13.1, Expected: 13 | |
| 4 | Actual: 104.1, Expected: 104 |
实现代码
import pandas as pd def compare_dataframes(df_expected, df_actual, pk_col='pk'): # 以Pk列为键合并两个DataFrame,只保留双方都有的行 merged = pd.merge(df_expected, df_actual, on=pk_col, suffixes=('_expected', '_actual'), how='inner') # 提取所有共同列(排除Pk列) common_cols = [col.split('_expected')[0] for col in merged.columns if '_expected' in col] # 构建差异结果字典 diff_results = {pk_col: merged[pk_col]} for col in common_cols: exp_col = f"{col}_expected" act_col = f"{col}_actual" # 标记当前列的差异行 has_diff = merged[exp_col] != merged[act_col] # 生成差异描述文本,无差异则为空 diff_text = merged.apply( lambda row: f"Actual: {row[act_col]}, Expected: {row[exp_col]}" if has_diff.loc[row.name] else "", axis=1 ) # 仅保留存在差异的列 if diff_text.str.strip().any(): diff_results[col] = diff_text # 转换为DataFrame并过滤掉无差异的行 df_diff = pd.DataFrame(diff_results) df_diff = df_diff[df_diff.drop(pk_col, axis=1).apply(lambda x: x.str.strip().any(), axis=1)] return df_diff # 测试示例数据 df_expected = pd.DataFrame({ 'pk': [1,2,3,4], 'column1': ['A','B','C','D'], 'amount1': [11,12,13,14], 'amount2': [101,102,103,104] }) df_actual = pd.DataFrame({ 'pk': [1,2,3,4], 'column1': ['A','B','C','D'], 'extra_column': ['AA','BB','CC','DD'], 'amount1': [11,12,13.1,14], 'amount2': [101,102,103,104.1] }) df_output = compare_dataframes(df_expected, df_actual) print(df_output)
内容的提问来源于stack exchange,提问作者bjnr
相关产品推荐
相关产品推荐

