Pandas DataFrame按ORDER ID与ASIN匹配映射Original Invoice ID 重复值逐行对应
Pandas DataFrame 按组合行顺序匹配字段值实现
样例数据
第一个DataFrame结构如下:
df1 = pd.DataFrame({'Original Invoice ID' : ['IN-11','IN-12','IN-13','IN-14','IN-15','IN-16'], 'ORDER ID' : ['123','123','123','456','996','864'], 'ASIN' : ['ABC','ABC','ABD','KSF','HKS','AJK']})
第二个DataFrame结构如下:
df2 = pd.DataFrame({'Invoice ID' : ['IN-C-45','IN-C-46','IN-C-47','IN-C-48'], 'ORDER ID' : ['123','123','456','864'], 'ASIN' : ['ABC','ABC','KSF','AJK']})
需求说明
基于ORDER ID和ASIN两个字段的匹配规则,为df2填充来自df1的Original Invoice ID字段值。
特殊规则:当df1中存在ORDER ID与ASIN均相同的重复记录时,需按照行顺序逐行对应映射,避免重复取值。
实现思路
- 对df1和df2分别按
ORDER ID、ASIN字段分组,为每个分组内的行生成从0开始的递增序号group_seq,标记同一组合下的行顺序 - 以
ORDER ID、ASIN、group_seq三个字段作为关联键,将df2与df1进行左连接,即可实现同组合下按行顺序逐一匹配,避免重复取值 - 最后删除辅助生成的
group_seq字段即可得到最终结果
实现代码
import pandas as pd # 给df1生成组内序号 df1['group_seq'] = df1.groupby(['ORDER ID', 'ASIN']).cumcount() # 给df2生成组内序号 df2['group_seq'] = df2.groupby(['ORDER ID', 'ASIN']).cumcount() # 多键左关联匹配 result = df2.merge( df1[['ORDER ID', 'ASIN', 'group_seq', 'Original Invoice ID']], on=['ORDER ID', 'ASIN', 'group_seq'], how='left' ) # 删除辅助列 result = result.drop('group_seq', axis=1)
输出结果
| Invoice ID | ORDER ID | ASIN | Original Invoice ID |
|---|---|---|---|
| IN-C-45 | 123 | ABC | IN-11 |
| IN-C-46 | 123 | ABC | IN-12 |
| IN-C-47 | 456 | KSF | IN-14 |
| IN-C-48 | 864 | AJK | IN-16 |
内容的提问来源于stack exchange,提问作者Akshay Tarpara
相关产品推荐
相关产品推荐

