如何校验DataFrame的所有行均完整包含在另一个同列DataFrame中
校验DataFrame A是否完全包含于DataFrame B的实现方法
已知前提:两个DataFrame列结构完全一致,且A+B两列的组合为全局唯一值,无重复行,可按以下两种方案实现校验:
方法1:基于唯一主键校验(效率更高,适配本题场景)
不需要比对全列内容,仅通过唯一主键的包含关系即可完成校验,执行效率更高:
import pandas as pd # 将A、B列拼接为唯一键,转字符串避免数值类型差异导致的匹配错误 a_unique_keys = set(dfA['A'].astype(str) + "_" + dfA['B'].astype(str)) b_unique_keys = set(dfB['A'].astype(str) + "_" + dfB['B'].astype(str)) # 校验A的所有主键是否都属于B的主键集合 all_exist = a_unique_keys.issubset(b_unique_keys) print(all_exist) # 输出True即代表dfA的所有行都完整包含在dfB中
方法2:全字段匹配(通用场景,无已知主键也可使用)
如果没有提前确认唯一主键,也可以通过全字段匹配实现校验,适合所有结构相同的DataFrame包含关系校验:
# 方案2.1 利用merge的关联标记校验 merge_df = pd.merge(dfA, dfB, how='left', on=dfA.columns.tolist(), indicator=True) all_exist = (merge_df['_merge'] == 'both').all() # 方案2.2 利用行元组的包含关系校验 a_rows = set(dfA.apply(tuple, axis=1)) b_rows = set(dfB.apply(tuple, axis=1)) all_exist = a_rows.issubset(b_rows)
小提示:本题10行、100行的小数据量级下三种实现的性能差异可忽略,数据量上万后方法1的性能优势会更明显
内容的提问来源于stack exchange,提问作者caasswa
相关产品推荐
相关产品推荐

