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

标签 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')

但是我得到的结果非常模糊,而且我无法用这种方法处理所有 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/

相关文章:

python - 在python中读取文件

python - 使用 python subprocess.call rm 目录下的所有文件

python - Pandas 按每周日期分组

python - 根据特定列中是否存在 NaN 在 python 数据框中创建一个新列

python - Pandas fillna 方法无法就地工作

python - 如何将按钮与 django-bootstrap3 分页放在同一行

python - 根据许多不同列的条件从数据框中删除行

Python:在哪里放置logging.getLogger

python - 如何使用 aiobotocore 模拟 AWS S3

python-3.x - pytables 的 DLL 加载失败