使用Python对比行数不同、索引无关的两个Excel文件并展示差异的问题
实现方法
首先需要先确定可以唯一标识一名学生的字段组合,你提供的样例中Name+Age+Birth_Country三个字段组合可以唯一匹配到同一个学生,我们就以该组合作为关联键实现无顺序、适配不同行数的对比,完整代码如下:
import pandas as pd import numpy as np # 读入两个Excel文件 df1 = pd.read_excel('School A - Information.xlsx') df2 = pd.read_excel('School B - Information.xlsx') # 配置项:唯一标识学生的字段列表 unique_keys = ['Name', 'Age', 'Birth_Country'] # 自动获取需要对比的属性字段列表 compare_cols = [col for col in df1.columns if col not in unique_keys] # 外连接合并两个表,通过唯一键匹配,自动区分两所学校的属性字段 merge_df = pd.merge( df1, df2, on=unique_keys, how='outer', suffixes=('_A', '_B') ) # 初始化结果表,先存唯一标识字段 result_df = merge_df[unique_keys].copy() # 逐字段对比标注差异 for col in compare_cols: a_col = f"{col}_A" b_col = f"{col}_B" result_df[col] = np.select( condlist=[ merge_df[a_col].isna(), # 仅学校B有该学生 merge_df[b_col].isna(), # 仅学校A有该学生 merge_df[a_col] == merge_df[b_col] # 两边属性一致 ], choicelist=[ "仅School B存在", "仅School A存在", merge_df[a_col] ], # 两边属性不一致,标注修改前后值 default=merge_df[a_col].astype(str) + " --> " + merge_df[b_col].astype(str) )
样例输出结果
对应你提供的测试数据,最终result_df的输出如下:
| Name | Age | Birth_Country | Previous Schools |
|---|---|---|---|
| tom | 10 | USA | 3 |
| nick | 15 | MEX | 1 --> 4 |
| juli | 14 | CAN | 仅School A存在 |
| tom | 19 | NOR | 1 |
如果你的实际数据中有更准确的唯一标识字段(比如学号),只需要修改unique_keys配置项即可,逻辑通用。
内容的提问来源于stack exchange,提问作者danielssl
相关产品推荐
相关产品推荐

