如何用Python判断DataFrame两字段值是否相等并标记结果?
问题分析与解决
你的代码逻辑错误:df1.duplicated(subset=['A', 'B'], keep=False)的作用是检测每行的A、B组合是否在DataFrame中重复出现,而非比较同一行内A和B的取值是否相等,这才导致结果不符合预期。
正确实现方式
以下几种方法都能实现你要的“每行A、B值相等标记OK,不等标记NG”的需求:
方法1:向量化布尔判断(推荐,效率最高)
import pandas as pd import numpy as np data1 = {'A': [1, 1, 2, 3, 4, 4, 2, 1], 'B': [2, 2, 3, 4, 4, 4, 1, 2]} df1 = pd.DataFrame(data1) # 直接比较A和B列,用np.where转换为OK/NG df1['OUTPUT'] = np.where(df1['A'] == df1['B'], 'OK', 'NG') print(df1)
方法2:使用map转换布尔结果
和你原代码写法类似,但逻辑正确:
import pandas as pd data1 = {'A': [1, 1, 2, 3, 4, 4, 2, 1], 'B': [2, 2, 3, 4, 4, 4, 1, 2]} df1 = pd.DataFrame(data1) # 先得到每行A==B的布尔序列,再映射为OK/NG df1['OUTPUT'] = (df1['A'] == df1['B']).map({True: 'OK', False: 'NG'}) print(df1)
方法3:apply逐行判断
适合复杂逻辑,效率略低于向量化方法:
import pandas as pd data1 = {'A': [1, 1, 2, 3, 4, 4, 2, 1], 'B': [2, 2, 3, 4, 4, 4, 1, 2]} df1 = pd.DataFrame(data1) # 逐行比较A和B的值 df1['OUTPUT'] = df1.apply(lambda x: 'OK' if x['A'] == x['B'] else 'NG', axis=1) print(df1)
正确输出结果
A B OUTPUT 0 1 2 NG 1 1 2 NG 2 2 3 NG 3 3 4 NG 4 4 4 OK 5 4 4 OK 6 2 1 NG 7 1 2 NG
关于字符串类型的补充说明
如果A、B字段实际是字符串类型(比如'1'、'2'),上述方法依然有效,只要同一行的A、B字符串内容完全一致,就会正确标记为OK。
内容的提问来源于stack exchange,提问作者Hsien
相关产品推荐
相关产品推荐

