我有两个大小不等的数据帧,下面是示例。我们将第一个数据帧称为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