如何用Pandas对比不同大小的DataFrame并筛选差异数据
用Pandas对比不同规模DataFrame找差异行
问题场景
手里有两个本该完全一致但行数不一样的DataFrame,要找出里面的差异数据。试了df.eq()方法,输出的只是每个单元格的布尔值,达不到需要的带所有行和校验结果的格式。
测试代码
import pandas as pd df = pd.DataFrame({'col1': [1, 2], 'col2': [3, 4]}) df2 = pd.DataFrame({'col1': [14, 22], 'col2': [32, 22]}) df.eq(df2)
当前输出
col1 col2 0 False False 1 False True
期望结果
col1 col2 Verify 1 3 False 2 4 False 14 32 False 22 22 True
解决办法
要拿到包含所有行和校验标记的结果,得先把两个表合并,再逐组校验对应行的所有列是否匹配:
代码实现
import pandas as pd df = pd.DataFrame({'col1': [1, 2], 'col2': [3, 4]}) df2 = pd.DataFrame({'col1': [14, 22], 'col2': [32, 22]}) # 把两个表纵向拼起来,重置索引方便分组 combined_df = pd.concat([df, df2]).reset_index(drop=True) # 每两行一组(对应两个表的同一位置行),检查组内所有列值是否完全一致 verify_results = combined_df.groupby(combined_df.index // 2).apply( lambda group: group.nunique().eq(1).all() ) # 把校验结果对应到每一行 combined_df['Verify'] = verify_results.repeat(2).values print(combined_df)
运行结果
col1 col2 Verify 0 1 3 False 1 2 4 False 2 14 32 False 3 22 22 True
额外技巧
如果两个表行数差异大,或者有主键可以关联,也可以用merge先关联再对比;要是想查看每个单元格的具体差异,用compare方法更直观:
# 查看单元格级别的详细差异 diff_details = df.compare(df2, keep_shape=True, keep_equal=True) print(diff_details)
内容的提问来源于stack exchange,提问作者Zan
相关产品推荐
相关产品推荐

