如何精确匹配两个DataFrame并输出1(匹配)/0(不匹配)?求解方法异常
DataFrame对应元素精确匹配输出1/0
需求
精确匹配两个DataFrame的对应元素,匹配则输出1,不匹配则输出0。
原始数据
df1
name | age | state | number | score ------------------------------------------------------ A 23 AZ 5434567 92.1 B 54 AZ 1234543 87.6 C 32 AZ 7654344 89.9 D 44 GA 8765433 72.4
df2
name | age | state | number | score ------------------------------------------------------ A 23 GA 5434567 92.1 D 54 AZ 1234543 76.4 C 33 AZ 7654344 99.9 D 46 GA 8765433 72.4
期望输出
name | age | state | number | score ------------------------------------------------------- 1 1 0 1 1 0 1 1 1 0 1 0 1 1 0 1 0 1 1 1
尝试过的代码及错误输出
代码1:使用eq方法
outputdf = df1.eq(df2)
错误输出:
name | age | state | number | score ------------------------------------------------------- 1 1 0 1 0 0 1 1 1 1 1 0 1 1 1 1 0 1 1 1
代码2:使用ne方法
outputdf = df1.ne(df2)
错误输出:
name | age | state | number | score ------------------------------------------------------- 1 1 0 1 0 0 1 1 1 1 1 0 0 0 1 0 0 0 0 1
解决方案
问题根源在于浮点数精度误差和方法逻辑不匹配:
eq方法直接比较浮点数时,因二进制存储的微小差异会误判相等性ne方法是判断元素不相等,和需求的“匹配输出1”逻辑完全相反
正确代码
# 处理浮点数精度后再匹配,最后转换为1/0格式 outputdf = df1.round(1).eq(df2.round(1)).astype(int)
步骤解释
- 精度修正:用
round(1)对含浮点数的score列保留一位小数,消除存储导致的微小误差 - 元素匹配:
eq方法判断对应位置元素是否相等,返回布尔值 - 格式转换:
astype(int)将布尔值True转为1,False转为0,符合输出要求
执行以上代码即可得到期望的结果。
内容的提问来源于stack exchange,提问作者Cosmo
相关产品推荐
相关产品推荐

