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

如何在Pandas中按行顺序实现一对一合并并保留左侧DataFrame结构?

Solution: One-to-One Ordered Matching Between DataFrames

这个需求确实没法用普通的左连接解决——因为我们要的是分组内按出现顺序一对一匹配,而不是生成所有可能的组合。这里有个简洁高效的矢量化方法,完全不需要写循环:

Step-by-Step Explanation

核心思路是给每个分组内的行添加一个“匹配序号”,然后用这个序号+分组键来合并两个DataFrame,确保每个分组里的第n行只和另一个DataFrame同分组的第n行匹配。

Code Implementation

import pandas as pd

# 原始数据初始化
l1=['a','b','c','c']
l2=['001','002','003','004']
l3=['a','a','b','b','c','c','c','c']
l4=['006','007','008','009','010','011','012','013']
dfa=pd.DataFrame(list(zip(l1,l2)),columns=['A1','A2'])
dfb=pd.DataFrame(list(zip(l3,l4)),columns=['B1','B2'])

# 为每个分组添加行内序号(从0开始计数)
dfa['match_idx'] = dfa.groupby('A1').cumcount()
dfb['match_idx'] = dfb.groupby('B1').cumcount()

# 按分组键+匹配序号进行左连接
merged_df = pd.merge(dfa, dfb, left_on=['A1', 'match_idx'], right_on=['B1', 'match_idx'], how='left')

# 整理输出列,去掉多余的列
final_result = merged_df[['A1', 'A2', 'B2']]

print(final_result)

Output

运行后会得到你期望的结果:

A1   A2   B2
0  a  001  006
1  b  002  008
2  c  003  010
3  c  004  011

Why This Works

  • groupby('A1').cumcount() 会给dfa中每个A1分组的行依次分配0、1、2...的序号,比如两个'c'行的序号分别是0和1。
  • 同理dfb中的每个B1分组也会得到对应的序号,比如四个'c'行的序号是0、1、2、3。
  • 合并时,dfa里序号为0的'c'行只会匹配dfb里序号为0的'c'行,序号为1的'c'行匹配dfb里序号为1的'c'行,完全实现了按顺序一对一匹配的需求。
  • 这种方法是矢量化操作,比循环快得多,尤其是处理大数据集时优势明显。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 23:23:12