如何实现Pandas DataFrame中重复键的顺序对应合并?
解决方案
要实现按组内行顺序匹配合并,你需要给两个DataFrame添加组内序号列,再基于Name和这个序号列进行合并,具体步骤如下:
- 给A和B分别添加组内计数列,标记每个
Name下的行顺序:
import pandas as pd A = pd.DataFrame({'Name' : ['A', 'A','A'], 'Value' : [1,2,3]}) B = pd.DataFrame({'Name': ['A', 'C', 'D', 'A', 'E', 'A'], 'Value1' :[1,2,3,4,5,6]}) # 为每个Name分组添加行序号 A['seq'] = A.groupby('Name').cumcount() B['seq'] = B.groupby('Name').cumcount()
- 同时按
Name和seq列做左连接合并,之后删除序号列:
result = A.merge(B, how='left', on=['Name', 'seq']).drop('seq', axis=1) print(result)
执行后得到的结果完全符合预期:
Name Value Value1 0 A 1 1 1 A 2 4 2 A 3 6
原理说明
groupby('Name').cumcount()会对每个Name分组内的行从0开始递增计数,A里的3个'A'会被标记为0、1、2,B里的3个'A'也会对应标记为0、1、2。- 基于
Name+seq合并时,只会匹配同组且同序号的行,彻底避免了普通merge按单一键值匹配产生的笛卡尔积问题。
内容的提问来源于stack exchange,提问作者ramesh
相关产品推荐
相关产品推荐

