如何合并两个DataFrame并保留部分匹配项,维持原DataFrame形状?
解决方案
要实现你需要的匹配逻辑,核心是给两个DataFrame的同(city, position)分组添加组内序号,通过序号限制匹配数量,避免全量笛卡尔积匹配。具体步骤如下:
- 构造示例数据(若数据已存在可跳过)
import pandas as pd d1 = pd.DataFrame({ 'id': [1,2,3,4,5,6], 'city': ['NY','NY','NY','NY','LA','LA'], 'position': ['manager','manager','manager','Engineer','Engineer','Designer'] }) d2 = pd.DataFrame({ 'team': ['a','a','b','b'], 'city': ['NY','NY','NY','LA'], 'position': ['manager','manager','Engineer','Engineer'] })
- 给两个DataFrame添加组内序号
对d1和d2按city、position分组,给每组内的行添加从1开始的顺序编号,让同分组、同序号的行一一对应:
# 给d1添加组内序号 d1['group_seq'] = d1.groupby(['city', 'position']).cumcount() + 1 # 给d2添加组内序号 d2['group_seq'] = d2.groupby(['city', 'position']).cumcount() + 1
- 按三键匹配得到目标结果
以city、position、group_seq为连接键做内连接,得到对应数量的匹配行,再调整列顺序:
matched_result = d1.merge(d2, on=['city', 'position', 'group_seq'], how='inner') # 调整列顺序至期望格式 matched_result = matched_result[['team', 'city', 'position', 'id']] print("匹配结果:") print(matched_result)
- 提取d1的剩余行
通过左连接标记匹配状态,筛选未匹配的行,保留原d1的列:
# 左连接并标记匹配情况 d1_full = d1.merge(d2, on=['city', 'position', 'group_seq'], how='left', indicator=True) # 筛选未匹配的行,保留原d1列 remaining_d1 = d1_full[d1_full['_merge'] == 'left_only'][['id', 'city', 'position']] print("\n剩余d1行:") print(remaining_d1)
执行后将得到你需要的两组结果,完全符合预期格式。
内容的提问来源于stack exchange,提问作者french_fries
相关产品推荐
相关产品推荐

