使用pandas连接多个软键和多个具有不同名称的硬键
是否可以使用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.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')