有条件地匹配两个大小不等的数据帧



我有两个大小不等的数据帧,下面是示例。我们将第一个数据帧称为df1:

Miles   AB  Param1  Param2  Param3  Param4
1.5 A   0.12345 0.12345 0.12345 0.12345
1.7 B   0.12345 0.12345 0.12345 0.12345
1.9 A   0.12345 0.12345 0.12345 0.12345
2.6 A   0.12345 0.12345 0.12345 0.12345
2.7 B   0.12345 0.12345 0.12345 0.12345
3.5 B   0.12345 0.12345 0.12345 0.12345
5.6 A   0.12345 0.12345 0.12345 0.12345
7.8 B   0.12345 0.12345 0.12345 0.12345
9.9 B   0.12345 0.12345 0.12345 0.12345

然后是一个类似的数据框,它有一些类似的信息,但有不同的列参数,并且比上面的数据框小,例如下面的数据框,我们将其称为df2:

Miles   AB  Param5
1.9 A   56
2.5 A   69
3.4 B   42
5.6 A   41

我要做的是在第一个表中添加Param5,条件是AB中的值相同,两个文件之间的英里差不超过0.1(理想情况下,英里是相等的,但基于这些文件的原始来源,有时它们可以相差0.1)。

Miles   AB  Param1  Param2  Param3  Param4  Param5
1.5 A   0.12345 0.12345 0.12345 0.12345 
1.7 B   0.12345 0.12345 0.12345 0.12345 
1.9 A   0.12345 0.12345 0.12345 0.12345 56
2.6 A   0.12345 0.12345 0.12345 0.12345 69
2.7 B   0.12345 0.12345 0.12345 0.12345 
3.5 B   0.12345 0.12345 0.12345 0.12345 42
5.6 A   0.12345 0.12345 0.12345 0.12345 41
7.8 B   0.12345 0.12345 0.12345 0.12345 
9.9 B   0.12345 0.12345 0.12345 0.12345 

我正在尝试使用一个np。Where函数如下所示,但显然在当前状态下不起作用,因为两个数据帧的行数不相等:

df1['Param5'] = np.where(((df2['AB']==df1['AB']) & (abs(df2['Miles']-df1['Miles'])<=0.1)), df2['Param5'],'')

返回ValueError: Can only compare identically-labeled Series objects

在AB值相同且英里差不超过0.1的条件下,如何将两个数据帧索引在一起,我将不胜感激。

提前感谢!

使用merge_asof:

(pd.merge_asof(df1.reset_index().sort_values(by='Miles'),
df2.sort_values(by='Miles'),
by='AB', on='Miles',
direction='nearest', tolerance=0.1)
.set_index('index').sort_index()
)

输出:

Miles AB   Param1   Param2   Param3   Param4  Param5
0    1.5  A  0.12345  0.12345  0.12345  0.12345     NaN
1    1.7  B  0.12345  0.12345  0.12345  0.12345     NaN
2    1.9  A  0.12345  0.12345  0.12345  0.12345    56.0
3    2.6  A  0.12345  0.12345  0.12345  0.12345     NaN
4    2.7  B  0.12345  0.12345  0.12345  0.12345     NaN
5    3.5  B  0.12345  0.12345  0.12345  0.12345     NaN
6    5.6  A  0.12345  0.12345  0.12345  0.12345    41.0
7    7.8  B  0.12345  0.12345  0.12345  0.12345     NaN
8    9.9  B  0.12345  0.12345  0.12345  0.12345     NaN

输出tolerance=0.10001:

Miles AB   Param1   Param2   Param3   Param4  Param5
0    1.5  A  0.12345  0.12345  0.12345  0.12345     NaN
1    1.7  B  0.12345  0.12345  0.12345  0.12345     NaN
2    1.9  A  0.12345  0.12345  0.12345  0.12345    56.0
3    2.6  A  0.12345  0.12345  0.12345  0.12345    69.0
4    2.7  B  0.12345  0.12345  0.12345  0.12345     NaN
5    3.5  B  0.12345  0.12345  0.12345  0.12345    42.0
6    5.6  A  0.12345  0.12345  0.12345  0.12345    41.0
7    7.8  B  0.12345  0.12345  0.12345  0.12345     NaN
8    9.9  B  0.12345  0.12345  0.12345  0.12345     NaN

最新更新