Python pandas对比两个DataFrame查找相同行时代码运行异常
问题根因
你的代码存在两个核心逻辑错误,导致所有行都被错误标记:
apply传入的行参数row完全没有被使用,函数里直接对比df3_2和df_condition两个整列的数组值,根本没有做「当前行是否匹配」的判断。- 两个numpy数组做
==对比返回的是布尔数组,只要数组不是全False,在Python的if判断里就会被判定为真值,因此永远会走到返回asdas的分支。
正确实现方案
优先用pandas原生merge实现,性能远高于逐行apply,逻辑也更可靠:
# 指定需要对比匹配的字段 compare_columns = ['dt', 'platform', 'network', 'currency', 'cost'] # 给对照DataFrame加临时匹配标记 df_condition['_is_match'] = 1 # 左连接把匹配标记同步到原DataFrame df3_2 = df3_2.merge( df_condition[compare_columns + ['_is_match']].drop_duplicates(), on=compare_columns, how='left' ) # 生成demo列,匹配到的行填asdas,未匹配填wewq df3_2['demo'] = df3_2['_is_match'].fillna(0).apply(lambda x: 'asdas' if x == 1 else 'wewq') # 删除临时标记列 df3_2.drop(columns=['_is_match'], inplace=True)
如果需要用逐行判断的逻辑(仅适合小数据量场景,大数据量性能很差),可以提前把对照数据转成元组集合做存在性判断:
compare_columns = ['dt', 'platform', 'network', 'currency', 'cost'] # 提前把对照df的对比字段转成元组集合,判断效率更高 match_set = set(df_condition[compare_columns].apply(tuple, axis=1)) def color(row): current_row = tuple(row[col] for col in compare_columns) return 'asdas' if current_row in match_set else 'wewq' df3_2['demo'] = df3_2.apply(color, axis=1)
注意事项
- 对比前请确认两个DataFrame中对比列的数据类型一致,例如日期列如果一个是字符串类型、一个是datetime类型,会被判定为不匹配。
- 如果
cost是浮点数类型,直接做等值判断可能存在精度误差,建议先按业务需要保留指定小数位再做对比。
内容的提问来源于stack exchange,提问作者Oğuz Kırçiçek
相关产品推荐
相关产品推荐

