gpt4 book ai didi

python - 计算数据帧所有行之间的成对欧几里得距离

转载 作者:行者123 更新时间:2023-12-04 20:49:41 24 4
gpt4 key购买 nike

如何计算数据帧所有行之间的欧几里得距离?我正在尝试此代码,但它不起作用:

zero_data = data
distance = lambda column1, column2: pd.np.linalg.norm(column1 - column2)
result = zero_data.apply(lambda col1: zero_data.apply(lambda col2: distance(col1, col2)))
result.head()

这是我的(44062 x 278)数据框的样子:

Please see sample data here

最佳答案

要计算数据帧 df 的两行 i 和 j 之间的欧几里德距离:

np.linalg.norm(df.loc[i] - df.loc[j])

要在连续行之间计算它,即 0 和 1、1 和 2、2 和 3,...
np.linalg.norm(df.diff(axis=0).drop(0), axis=1)

如果你想在所有行之间计算它,即 0 和 1、0 和 2、...、1 和 1、1 和 2 ...,那么你必须遍历 i 和 j 的所有组合(保持请记住,对于 44062 行,有 970707891 个这样的组合,因此使用 for 循环会非常慢):
import itertools

for i, j in itertools.combinations(df.index, 2):
d_ij = np.linalg.norm(df.loc[i] - df.loc[j])

编辑:

相反,您可以使用 scipy.spatial.distance.cdist它计算每对两个输入集合之间的距离:
from scipy.spatial.distance import cdist

cdist(df, df, 'euclid')

这将返回一个对称(44062 x 44062)的数据帧所有行之间的欧几里得距离矩阵。问题是您需要大量内存才能工作(至少 8*44062**2 字节的内存,即 ~16GB)。
所以更好的选择是使用 pdist
from scipy.spatial.distance import pdist

pdist(df.values, 'euclid')

这将返回 df 行之间所有成对欧几里得距离的数组(大小为 970707891)。

附言不要忘记在计算距离时忽略“Actual_data”列。例如。您可以执行以下操作: data = df.drop('Actual_Data', axis=1).values然后 cdist(data, data, 'euclid')pdist(data, 'euclid') .您还可以创建另一个具有如下距离的数据框:
data = df.drop('Actual_Data', axis=1).values

d = pd.DataFrame(itertools.combinations(df.index, 2), columns=['i','j'])
d['dist'] = pdist(data, 'euclid')


i j dist
0 0 1 ...
1 0 2 ...
2 0 3 ...
3 0 4 ...
...

关于python - 计算数据帧所有行之间的成对欧几里得距离,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60574862/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com