如何在2个数据帧的3列中找到最接近的值?

时间:2019-07-11 05:18:25

标签: python python-3.x dataframe

我在两个数据框中有如下数据:-

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

1 个答案:

答案 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