如何基于指定匹配条件合并两个Pandas DataFrame数据框
基于code和id字段合并两个DataFrame的正确实现
错误原因说明
你之前的代码存在两个核心问题:
merge_asof是专为有序键(比如时间序列)的左对齐合并设计的,不适用当前需要按多个离散字段匹配的场景- 你指定的合并字段
page在df1、df2中都不存在,运行会直接报错,更不可能得到预期结果
实现思路
你的需求里,相同code+id的分组下,需要让两个表的行按顺序一一匹配:
- red+id=2分组:df1有3行、df2仅有1行,df1的3行都匹配df2的唯一grade值
- blue+id=3分组:df1有3行、df2有3行,按行顺序依次匹配grade值
要避免直接按code+id合并出现笛卡尔积(blue分组会生成9行冗余数据),只需要给两个表的每个分组新增组内顺序号,再把顺序号也加入合并键即可。
实现代码
import pandas as pd # 原始数据定义 df1=pd.DataFrame({'text':['ASX-112','YTR-789','ASX-124','UYT-908','TYE=456','ERW-234'], 'code':['red','red','red','blue','blue','blue'],'id':[2,2,2,3,3,3]}) df2=pd.DataFrame({'grade':['a','b','c','d'],'code':['red','blue','blue','blue'],'id':[2,3,3,3]}) # 给每个code+id分组新增组内顺序列 df1['group_rank'] = df1.groupby(['code','id']).cumcount() df2['group_rank'] = df2.groupby(['code','id']).cumcount() # 按多键合并后删除辅助列 result = pd.merge(df1, df2, on=['code','id','group_rank'], how='left').drop('group_rank', axis=1)
输出结果
text code id grade 0 ASX-112 red 2 a 1 YTR-789 red 2 a 2 ASX-124 red 2 a 3 UYT-908 blue 3 b 4 TYE=456 blue 3 c 5 ERW-234 blue 3 d
内容的提问来源于stack exchange,提问作者anonymous
相关产品推荐
相关产品推荐

