使用Python查找最相似的行

4

我有两个数据框(df1和df2),在df1中,我存储了一行值集合,我想找到df2中最相似的行。

import pandas as pd
import numpy as np

# Df1 has only one row and four columns.
df1 = pd.DataFrame(np.array([[30, 60, 70, 40]]), columns=['A', 'B', 'C','D'])

# Df2 has 50 rows and four columns
df2 = pd.DataFrame(np.random.randint(0,100,size=(50, 4)), columns=list('ABCD'))

问题:基于df1,df2中哪一行最相似?


2
你为相似定义了什么? - BENY
我正在寻找df2中与df1相比,A、B、C和D之间差异最小的行。 - Sin
2个回答

8

将 df2 减去 df1 并计算每行的范数。找到最小的范数并解决问题。

diff_df = df2 - df1.values
# or diff_df = df2 - df1.iloc[0, :]
norm_df = diff.apply(np.linalg.norm, axis=1)
df2.loc[norm_df.idxmin()]

这个技术易于阅读且运行速度快。


我在我的数据集上检查了你的方法和@Wen-Ben的方法,结果相同。感谢你的帮助! - Sin
不客气。调用 scipy.spatial.distance.cdist 是个绝妙的主意。@Sin - David Wu

7

如果你想要最小距离,可以使用scipy.spatial.distance.cdist

import scipy
ary = scipy.spatial.distance.cdist(df2, df1, metric='euclidean')
df2[ary==ary.min()]
Out[894]: 
     A   B   C   D
14  16  66  83  13

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接