我在两个数据框中有如下数据:-
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')
但是我得到的结果非常模糊,我无法用这种方法处理所有三个方面。
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
答案 0 :(得分:0)
使用:
#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