使用pandas连接多个软键和多个具有不同名称的硬键

使用pandas连接多个软键和多个具有不同名称的硬键,pandas,Pandas,是否可以使用pandas连接多个软键,例如,当我们允许匹配的公差范围和两个表中名称不同的多个硬键时 似乎pandas.merge\u 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,

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

似乎
pandas.merge\u 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):

我理解,对于硬键,我们可以 使用by和rename列,但这可能不容易被系统支持,因为其他系统组件可能依赖于旧的命名。有没有一种干净、好的方法可以在不进行多次命名重命名的情况下实现它?
但在多个软键上连接的问题仍然不清楚…

在精确合并后执行公差:

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')
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')