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
相关产品推荐
相关产品推荐

