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

如何合并两个DataFrame并保留部分匹配项,维持原DataFrame形状?

解决方案

要实现你需要的匹配逻辑,核心是给两个DataFrame的同(city, position)分组添加组内序号,通过序号限制匹配数量,避免全量笛卡尔积匹配。具体步骤如下:

  1. 构造示例数据(若数据已存在可跳过)
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']
})
  1. 给两个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
  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)
  1. 提取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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 15:53:31