例如当我们允许匹配的公差范围和两个表中命名不同的多个硬键时,是否可以使用熊猫来连接多个软键?
似乎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_by
和right_by
,我们可以
使用by和rename列,但是由于其他系统组件可能依赖于旧的命名,因此系统可能不容易支持这一点。没有多次命名重命名的方法,有没有一种干净而又不错的方法来实现?
但是连接多个软键的问题仍然不清楚...
答案 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')