pandas Dataframe 中的行的成对比较和计算欧氏距离

dw1jzc5e  于 2023-06-20  发布在  其他
关注(0)|答案(1)|浏览(126)

我有以下 Dataframe

region   country   val_a   val_b 
reg1     cntr1     0.5      0.7
reg2     cntr1     1        2
reg3     cntr1     2        1.2
reg1     cntr2     3        0.3
reg44    cntr2     0.2      0.7

我想循环遍历这个数据框,将每一行与其他行进行比较,找出每一对行的val_aval_b之间的欧氏距离,并创建以下数据框

source_region    source_country    dest_region    dest_country    distance
reg1              cntr1             reg2           cntr1            0.9
reg1               cntr1            reg3           cntr1            1.5

...
我可以做一个嵌套循环来创建这样的东西,但有没有一个更Python的方法来完成它?请注意,在本例中,distance列值是随机的。你可以使用任何你喜欢的公式来计算欧几里德距离,我只是想让成对比较的逻辑正确。

toiithl6

toiithl61#

您可以使用itertools中的组合。这可以产生行索引的所有组合的列表,其然后可以用于形成新的数据框。显然,以下代码中的距离计算仅是说明性的。代码是分步骤完成的,因此如果需要,您可以查看中间层。

import pandas as pd
import numpy as np
from itertools import combinations

idxs = list(combinations(df.index,2))
dfx = pd.DataFrame(np.concatenate((df.iloc[idx[0]].values, df.iloc[idx[1]].values)) for idx in idxs)
dfx.columns = ['s_region', 's_country', 's_1', 's_2', 'd_region', 'd_country', 'd_1', 'd_2']
dfx['distance'] = dfx['s_1']-dfx['s_2']+dfx['d_1']-dfx['d_2']
print(dfx)

其给出:

s_region s_country  s_1  s_2 d_region d_country  d_1  d_2  distance
0     reg1     cntr1  0.5  0.7     reg2     cntr1  1.0  2.0      -1.2
1     reg1     cntr1  0.5  0.7     reg3     cntr1  2.0  1.2       0.6
2     reg1     cntr1  0.5  0.7     reg1     cntr2  3.0  0.3       2.5
3     reg1     cntr1  0.5  0.7    reg44     cntr2  0.2  0.7      -0.7
4     reg2     cntr1  1.0  2.0     reg3     cntr1  2.0  1.2      -0.2
5     reg2     cntr1  1.0  2.0     reg1     cntr2  3.0  0.3       1.7
6     reg2     cntr1  1.0  2.0    reg44     cntr2  0.2  0.7      -1.5
7     reg3     cntr1  2.0  1.2     reg1     cntr2  3.0  0.3       3.5
8     reg3     cntr1  2.0  1.2    reg44     cntr2  0.2  0.7       0.3
9     reg1     cntr2  3.0  0.3    reg44     cntr2  0.2  0.7       2.2

这假设源A,dest B与源B,dest A相同,因为两个距离将相同。如果你想拥有每一个源和每一个目的地,那么使用permutations而不是combinations

相关问题