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

Pandas对比DataFrame两组对应列 值存在差异时给key列计数加1

问题描述

合并两个DataFrame后得到带同名列后缀_x/_y的数据集,样例结构如下:

ID   name_x   name_y   age_x   age_y
1    Steve    Steve    40      40
2    John     John     34      35

预先定义两组对应待对比的列名列表:

list_a = ["name_x", "age_x"]
list_b = ["name_y", "age_y"]

需求为逐组对比两个列表对应位置的列值:同一行中每出现一对列值不相等,就给该行的key列计数加1,最终期望输出结构如下:

ID   name_x   name_y   age_x   age_y  key
1    Steve    Steve    40      40     0
2    John     John     34      35     1

原有双层for循环写法未达到预期,错误代码如下:

for a in list_a:
    for b in list_b:
        master.loc[master[a] != master[b], 'key'] = +1 
错误原因
  • 双层循环会生成笛卡尔积的对比组合,比如拿name_x和age_y比、age_x和name_y比,完全不符合「对应位置列配对对比」的要求
  • 赋值语句写的= +1是固定给符合条件的行赋值为1,不是累加操作,哪怕多列同时不匹配也只会得到1,无法累计多组差异
  • 未预先给key列设置初始值0,会出现空值问题
  • 原列表中写的age_X为大写X,和实际列名age_x大小写不匹配,会触发KeyError
正确实现

直接用pandas向量化运算实现,避免无意义的循环,逻辑清晰且运行效率更高:

# 初始化key列,所有行初始计数为0
master["key"] = 0

# 按位置配对两列,逐组对比累加差异次数
for a_col, b_col in zip(list_a, list_b):
    # 两列值不等时返回True,转成int就是1,累加给key列
    master["key"] += (master[a_col] != master[b_col]).astype(int)

补充:如果数据中存在空值,需要把两边空值判定为相等的话,可以把对比逻辑替换为master[a_col].fillna("__NA_MARK__") != master[b_col].fillna("__NA_MARK__"),避免pandas中空值比较默认返回False的问题。

内容的提问来源于stack exchange,提问作者Berny

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 12:48:15