如何提取两个同结构DataFrame中存在差异行的ssno列值?
提取两个DataFrame中存在差异行的唯一标识ssno
嘿,这个需求我之前在做数据一致性校验的时候常碰到,用Pandas就能轻松搞定,给你分享几个实用的方案:
方案一:直接逐行对比(适用于行顺序完全一致的情况)
如果你的df1和df2行数一致,且每一行的ssno是一一对应的,直接用逐元素对比就能快速定位差异行:
import pandas as pd # 生成布尔索引:标记所有存在任意列差异的行 diff_mask = df1.ne(df2).any(axis=1) # 提取差异行对应的ssno,转成列表按需使用 differing_ssnos = df1.loc[diff_mask, 'ssno'].tolist()
代码说明:
df1.ne(df2):逐元素对比两个DataFrame,返回布尔型DataFrame,True表示对应位置的值不同.any(axis=1):按行检查,只要该行有至少一个True(存在差异)就返回True- 最后用这个索引过滤
df1,提取目标ssno列即可
方案二:按唯一标识对齐后对比(适用于行顺序可能不一致的情况)
如果不确定两个DataFrame的行顺序是否匹配,建议先通过ssno对齐,避免顺序问题导致误判:
# 将两个DataFrame都设置为以ssno为索引,确保数据对齐 df1_indexed = df1.set_index('ssno') df2_indexed = df2.set_index('ssno') # 找出存在差异的行索引(即ssno) diff_index = df1_indexed.ne(df2_indexed).any(axis=1) differing_ssnos = diff_index[diff_index].index.tolist()
特殊处理:缺失值场景
Pandas中NaN和NaN对比会返回False(视为相等)。如果需要把「一个是NaN一个是有效值」的情况标记为差异,上面的代码已经自动处理;如果要把两边都是NaN的情况也视为差异,可以先填充缺失值再对比:
# 用自定义值填充缺失值,示例用空字符串,可根据业务调整 fill_val = '' diff_mask = df1.fillna(fill_val).ne(df2.fillna(fill_val)).any(axis=1) differing_ssnos = df1.loc[diff_mask, 'ssno'].tolist()
这些方法都能高效帮你拿到所有存在数据差异的行对应的ssno,根据你的数据情况选合适的就行~
内容的提问来源于stack exchange,提问作者Arijit Ghosh
相关产品推荐
相关产品推荐

