如何找出新DataFrame中旧DataFrame无的额外行?已试setdiff()、comparedf()无效
识别DataFrame中的额外行解决方案
用merge标记来源筛选额外行
- 用
merge()做外连接并开启来源标记,直接提取仅存在于新DataFrame的行:merged_df = new_df.merge(old_df, how='outer', indicator=True) extra_rows = merged_df[merged_df['_merge'] == 'left_only'] left_only就是只在新DataFrame里出现的行,直接筛选就得到目标结果。
基于唯一标识或整行内容对比
如果有唯一ID列:
- 先把旧DataFrame的ID存成集合,再筛新DataFrame里不在这个集合的行:
old_unique_ids = set(old_df['unique_id']) extra_rows = new_df[~new_df['unique_id'].isin(old_unique_ids)]
如果没有唯一ID,就把每行转成元组对比:
old_row_set = set(old_df.apply(tuple, axis=1)) extra_rows = new_df[~new_df.apply(tuple, axis=1).isin(old_row_set)]
原方法失效的常见原因
setdiff()对数据匹配要求极高,只要列类型不一致、存在NaN(NaN和任何值不相等),就会匹配失败,导致识别不出额外行。comparedf()(比如janitor库的实现)默认参数可能只聚焦列、值的差异,完全新增的行需要调整参数(比如keep_shape=False)才能被识别。
内容的提问来源于stack exchange,提问作者for quora
相关产品推荐
相关产品推荐

