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

Pandas如何合并两个DataFrame并按列匹配结果添加0/1标记列

Pandas 为DataFrame新增匹配标识列实现方案

首先构造测试用的两个DataFrame,和描述的数据源完全一致:

import pandas as pd

# 待匹配数据集
df1 = pd.DataFrame({
    'name': ['apple', 'apple', 'banana', 'banana'],
    'number': [102, 104, 103, 105]
})

# 基准对比数据集
df2 = pd.DataFrame({
    'name': ['apple', 'banana'],
    'number': [102, 105]
})

方法1:左连接实现(完全匹配左连接逻辑,大数据量下性能更优)

关联键使用name+number联合匹配,避免不同name下相同number值导致的误匹配:

# 给基准表添加匹配标记
df2_flag = df2.assign(match=1)
# 左连接关联两个表
df_res = df1.merge(df2_flag, on=['name', 'number'], how='left')
# 未匹配到的行填充0,转为整数类型
df_res['match'] = df_res['match'].fillna(0).astype(int)

方法2:集合判断实现(小数据量下写法更简洁)

把基准表的(name, number)组合转为集合,逐行判断当前行组合是否存在于集合中:

df_res = df1.copy()
# 生成基准匹配对集合
match_set = set(zip(df2['name'], df2['number']))
# 逐行判断生成match列
df_res['match'] = df_res.apply(
    lambda row: 1 if (row['name'], row['number']) in match_set else 0, 
    axis=1
)

执行以上任意一种方法后,打印df_res即可得到预期结果:

name  number  match
0   apple     102      1
1   apple     104      0
2  banana     103      0
3  banana     105      1

注意:如果业务规则不需要区分name,只要number值出现在基准表的number列就算匹配,只需要把关联键改为['number'],或者集合里只存df2['number']的值即可。联合匹配是更严谨的写法,能避免跨分类同值导致的匹配错误。

内容的提问来源于stack exchange,提问作者stephsmith

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 03:39:23