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
相关产品推荐
相关产品推荐

