我有两个数据帧中的数据,如下所示:-
Df1
Container_width Container_height Container_depth
19.1 13.8 27.1
14.0 11.5 24.5
30.8 14.6 34.6
24.1 24.6 31.3
38.9 18.2 42.9
53.3 51.3 55.4
55.5 29.0 75.5
19.8 44.5 29.7
Df2
Item_width Item_height Item_depth
19.101496 11.497524 27.081574
19.094842 13.963226 26.889088
30.987301 14.600599 34.808122
38.522297 15.363778 56.248184
22.384495 15.291478 34.511771
30.801670 14.657632 34.703047
30.799078 14.495006 34.611856
22.829969 15.743264 31.294219
对于 Df2 中的每个项目,我想在 Df1 中找到最接近的可能容器尺寸。
示例:-
Item dimensions with : 30.987301 14.600599 34.808122
Should match : 30.8 14.6 34.6
因为元素的所有尺寸都最接近容器的所有尺寸。
根据我对 stackoverflow 的研究,我尝试了 sub、idxmin 和 abs 函数,但无法得到结果。
Df2['val'] = Df2.sub(Df1,axis=0).abs().idxmin(axis=1)
但是通过这种方法我得到了 NaN 结果。
我尝试的第二种方法是:-
Df2.sort_values('pred_height', inplace=True)
Df1.sort_values('container_size_height', inplace=True)
pd.merge_asof(Df2, Df1,left_on = 'pred_height', right_on='container_size_height')
但是我得到的结果非常模糊,而且我无法用这种方法处理所有 3 个维度。
Ideal expected result would be:-
Item_width Item_height Item_depth Container_width Container_height Container_depth
30.987301 14.600599 34.808122 30.8 14.6 34.6
最佳答案
用途:
#cross join for merge both DataFrames together
df = Df2.assign(a=1).merge(Df1.assign(a=1), on='a', how='outer').drop('a', axis=1)
c1 = ['Container_width','Container_height','Container_depth']
c2 = ['Item_width','Item_height','Item_depth']
#get distance to new column
df['d'] = ((df[c2] - df[c1].values) ** 2).sum(axis= 1) ** .5
#get rows with minimal distance per groups
df = df.loc[df.groupby(c2)['d'].idxmin()]
print (df)
Item_width Item_height Item_depth Container_width Container_height \
8 19.094842 13.963226 26.889088 19.1 13.8
0 19.101496 11.497524 27.081574 19.1 13.8
32 22.384495 15.291478 34.511771 19.1 13.8
56 22.829969 15.743264 31.294219 19.1 13.8
50 30.799078 14.495006 34.611856 30.8 14.6
42 30.801670 14.657632 34.703047 30.8 14.6
18 30.987301 14.600599 34.808122 30.8 14.6
28 38.522297 15.363778 56.248184 38.9 18.2
Container_depth d
8 27.1 0.266746
0 27.1 2.302550
32 27.1 8.242983
56 27.1 5.939732
50 34.6 0.105665
42 34.6 0.118080
18 34.6 0.279994
28 42.9 13.651404
关于python - 如何在 2 个数据帧的 3 列中找到最接近的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56982063/