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

Python pandas对比两个DataFrame查找相同行时代码运行异常

问题根因

你的代码存在两个核心逻辑错误,导致所有行都被错误标记:

  1. apply传入的行参数row完全没有被使用,函数里直接对比df3_2和df_condition两个整列的数组值,根本没有做「当前行是否匹配」的判断。
  2. 两个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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 15:12:21