如何计算熊猫与列表之间的欧几里得距离?

时间:2019-01-18 21:07:57

标签: python pandas scipy

我有一个熊猫数据框,我尝试用固定值计算所有欧几里得距离,并找到最短距离。

我的数据框“货币”:

        Stype   h  line        ...            y    y2                bc
45   currency  38    13        ...         1344  1382  (1731.0, 1363.0)
46   currency  38    13        ...         1343  1381  (2015.0, 1362.0)
47   currency  39    13        ...         1342  1381  (2267.5, 1361.5)
60   currency  39    15        ...         2718  2757   (488.0, 2737.5)
61   currency  39    15        ...         2717  2756   (813.5, 2736.5)
62   currency  39    15        ...         2718  2757  (1332.5, 2737.5)
63   currency  40    15        ...         2716  2756  (1821.5, 2736.0)
64   currency  39    15        ...         2715  2754  (2286.5, 2734.5)
68   currency  39    17        ...         2874  2913  (2287.5, 2893.5)
162  currency  30    22        ...         3311  3341  (1104.5, 3326.0)

列表[l ['bc']]中的示例值

[(2126.5, 2657.0)]

我的代码:

for l in label_dic:
    print('bc:', [l['bc']])
    print(cdist([l['bc']], currency.bc.values, 'euclidean'))

我的问题:

ValueError: XB must be a 2-dimensional array.

我已通过以下方式验证了我的功能:

print(cdist([l['bc']], [l['bc']], 'euclidean'))
Result: [[0.]]

您能请我修理一下吗?

谢谢

1 个答案:

答案 0 :(得分:1)

currency.bc.values似乎提供了一个元组的一维numpy数组,但是cdist需要一个二维的numpy数组。您可以使用np.array([* currency.bc.values])将其转换为2d数组

请参见下面的示例

from scipy.spatial import distance
import pandas as pd
import numpy as np

mypoint = [(0, 0)]
df = pd.DataFrame({'coord1': [(0,10), (10,0)]})
#option 1    
print(distance.cdist(mypoint , np.array([*df.coord1.values]), 'euclidean'))
#option2 
print(distance.cdist(mypoint , df.coord1.values.tolist(), 'euclidean'))

产生

[[10. 10.]]
[[10. 10.]]