Python如何校验DataFrame所有行是否存在于另一DataFrame
错误原因
你原有代码的合并逻辑写反了:以dfActual为左表做左连接,实际是在校验dfActual的行是否存在于dfExpected中,和你需要的「校验dfExpected所有行是否存在于dfActual」的需求完全相反;且代码仅给dfActual逐行打了匹配标记,没有做全局的全匹配判断,因此无法得到正确结果。
正确实现代码
方法1:合并标记全局判断法
通过调整合并方向,逐行标记dfExpected的行是否在dfActual中存在,最终判断是否所有行都匹配成功:
check_result = ( dfExpected .merge(dfActual, how='left', indicator=True) .eval('_merge == "both"') .all() )
返回值check_result为布尔类型:dfExpected所有行都在dfActual中存在时返回True,否则返回False。
方法2:差集空值判断法
直接计算「dfExpected存在但dfActual不存在」的行差集,若差集为空则代表全部匹配:
check_result = dfExpected.merge(dfActual, how='left', indicator=True).query('_merge == "left_only"').empty
注意事项
- 校验前需保证两个DataFrame的列名、对应列的数据类型完全一致,否则会出现类型不匹配导致的判定错误,例如同一列一个存储为字符串格式数字、一个存储为数值格式数字,会被判定为不相等
- 若两个表列顺序不一致,可先执行
dfActual = dfActual[dfExpected.columns]对齐列顺序,避免列顺序干扰匹配结果 - 无需为原DataFrame新增多余的标记列,上述代码可直接返回最终的全局布尔结果
内容的提问来源于stack exchange,提问作者Karthika
相关产品推荐
相关产品推荐

