You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何提取两个同结构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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 07:31:15