Python 使用pandas连接软键和硬键混合的复合键

Python 使用pandas连接软键和硬键混合的复合键,python,pandas,join,Python,Pandas,Join,我正在寻找一种方法来做熊猫部分软连接,这意味着我有复合连接键 ["soft_key", "hard_key_1", "hard_key_2"] 软键应该在某个范围内连接,而不是精确匹配。 在pandas.merge\u asof中,它被称为公差。例如,如果键为10,公差为2,则会发生以下连接: 表1 soft_key | hard_key_1 | hard_key_2 | val_1 10 | 2 | 5 | "Jo" 20 | 1

我正在寻找一种方法来做熊猫部分软连接,这意味着我有复合连接键

["soft_key", "hard_key_1", "hard_key_2"]
软键应该在某个范围内连接,而不是精确匹配。 在
pandas.merge\u asof
中,它被称为
公差
。例如,如果键为10,公差为2,则会发生以下连接:

表1

soft_key | hard_key_1 | hard_key_2 | val_1
10       | 2          | 5          | "Jo"
20       | 1          | 1          | "Lu"
表2

soft_key | hard_key_1 | hard_key_2 | val_2 
12       | 2          | 5          | "Mary"
10       | 3          | 5          | "Helen"
25       | 1          | 1          | "Nancy"
加入

*我并没有包括键加入为简短

好像是熊猫。merge_asof会在软键上加入,但如何在软键和硬键的组合上加入

有可能以某种方式结合起来吗

table1.merge(table2, how="left", on=[hard_key_1, hard_key2])

完成任务


谢谢

这里有一个从
merge\u asof

pd.merge_asof(df2.sort_values('soft_key'),df1.sort_values('soft_key'),by=['hard_key_1','hard_key_2'],on='soft_key',tolerance=2).dropna()
   soft_key  hard_key_1  hard_key_2   val_2 val_1
1        12           2           5  "Mary"  "Jo"

这里有一种来自
merge\u asof

pd.merge_asof(df2.sort_values('soft_key'),df1.sort_values('soft_key'),by=['hard_key_1','hard_key_2'],on='soft_key',tolerance=2).dropna()
   soft_key  hard_key_1  hard_key_2   val_2 val_1
1        12           2           5  "Mary"  "Jo"

谢谢,你能详细说明一下这段代码中发生了什么吗?我猜需要排序来加速连接?@YohanRoth排序是merge_asof必须的,你也可以检查我测试的链接,看起来公差只考虑在负方向上,就像它最多是左键一样,但公差量可以小于左键。是否可以将公差设置为+/-而不是-@YohanRoth添加
方向class='nearest'
,因为默认值为backward谢谢,您能详细说明这段代码中发生了什么吗?我猜需要排序来加速连接?@YohanRoth排序是merge_asof必须的,你也可以检查我测试的链接,看起来公差只考虑在负方向上,就像它最多是左键一样,但公差量可以小于左键。是否可以将公差设置为+/-而不是-@YohanRoth添加
direction='nearest'
,因为默认值为backward
pd.merge_asof(df2.sort_values('soft_key'),df1.sort_values('soft_key'),by=['hard_key_1','hard_key_2'],on='soft_key',tolerance=2).dropna()
   soft_key  hard_key_1  hard_key_2   val_2 val_1
1        12           2           5  "Mary"  "Jo"