使用熊猫加入多个具有不同名称的软键和多个硬键

时间:2019-06-17 17:37:06

标签: pandas

例如当我们允许匹配的公差范围和两个表中命名不同的多个硬键时,是否可以使用熊猫来连接多个软键?

似乎pandas.merge_asof仅允许连接一个软键,并且不允许分别为左右表指定硬键名称(以防它们使用不同的名称,并且重命名不容易处理)

考虑以下两个数据集

表1:

软键:sk1,sk2

硬键:x,y

sk1,sk2,x,y,val1
10,100,10,15,1
20,200,20,25,2
30,300,10,10,3

表2:

软键:sk1,sk2

硬键:k1,k2

sk1,sk2,k1,k2,val2,x,y
15,110,10,15,3,1,1
23,230,20,25,5,2,2
34,330,10,10,-1,3,3

我需要等同于

的东西
soft_merge(t1, t2, left_by=["x","y"], right_by=["k1","k2"], on=[sk1, sk2], tolerance=[5,15])

获取输出(仅为清楚起见显示了val):

val1 | val2
1    | 3

我知道代替硬键的left_byright_by,我们可以 使用by和rename列,但是由于其他系统组件可能依赖于旧的命名,因此系统可能不容易支持这一点。没有多次命名重命名的方法,有没有一种干净而又不错的方法来实现? 但是连接多个软键的问题仍然不清楚...

1 个答案:

答案 0 :(得分:1)

在精确合并后实施公差:

m = df1.merge(df2, left_on=["x","y"], right_on=["k1","k2"])
mask = (m.sk1_x - m.sk1_y).abs().le(5) & (m.sk2_x - m.sk2_y).abs().le(15)

m.loc[mask, ['val1', 'val2']]
#   val1  val2
#0     1     3

这不能确保1:1合并,并且会给出实现该公差的所有组合。如果需要“最近”匹配,则需要指定一些距离公式并仅保留最接近的公式。在这里,我使用总的绝对距离。假设val1是唯一键:

m['dist'] = (m.sk1_x - m.sk1_y).abs() + (m.sk2_x - m.sk2_y).abs()
m.sort_values('dist').loc[mask].drop_duplicates('val1')