Python 如何使用pandas测量XY点之间的距离

Python 如何使用pandas测量XY点之间的距离,python,pandas,loops,math,Python,Pandas,Loops,Math,我有code来测量XY坐标之间的距离,但我希望通过使用pandas来提高效率 假设我有一些主体的XY坐标: id_X = [1,2,7,19] #Subject 1 id_Y = [2,5,5,7] #Subject 1 cd_X = [3,3,8,20] #Subject 2 cd_Y = [2,5,6,7] #Subject 2 我想根据另一个重要的XY坐标测量这些物体的距离: Factor_X = [10,20,30,20] #Important XY Factor_Y = [2,5,6

我有
code
来测量
XY
坐标之间的距离,但我希望通过使用
pandas
来提高效率

假设我有一些主体的
XY
坐标:

id_X = [1,2,7,19] #Subject 1
id_Y = [2,5,5,7] #Subject 1
cd_X = [3,3,8,20] #Subject 2
cd_Y = [2,5,6,7] #Subject 2
我想根据另一个重要的
XY
坐标测量这些物体的距离:

Factor_X = [10,20,30,20] #Important XY
Factor_Y = [2,5,6,7] #Important XY
为了得到第一个主题的距离,我使用下面的方法并迭代每一行

dist = math.sqrt(((id_X[0] - Factor_X[0])**2)+((id_Y[0] - Factor_Y[0])**2))
获取第二个主题的距离,我将交换
id\ux
id\uy
以获得
cd\ux
cd\uy

如果我有很多科目,这将变得非常低效。因此,我试图通过
pandas
实现相同的概念

以下是我的尝试:

d = ({                
    'id_X' : [1,2,7,19], 
    'id_Y' : [2,5,5,7], 
    'cd_X' : [3,3,8,20], 
    'cd_Y' : [2,5,6,7],
    'Factor_X' : [10,20,30,20], 
    'Factor_Y' : [2,5,6,7],          
     })

df = pd.DataFrame(data= d)

df['distance'] = math.sqrt(((df['id_X']-df['Factor_X'])**2)+((df['id_Y']-df['Factor_Y'])**2))
df['distance'] = math.sqrt(((df['cd_X']-df['Factor_X'])**2)+((df['cd_Y']-df['Factor_Y'])**2))
但这会返回一个错误:

TypeError: cannot convert the series to <class 'float'>

这种方法可行吗?它会创造一种更具时效性的方法吗?

过滤掉
id
cd
,然后照常进行

ids = df.filter(like='id')
cds = df.filter(like='cd')  
factor = df.filter(like='Factor')

df['id_distance'] = ((ids.values - factor.values) ** 2).sum(1) ** .5
df['cs_distance'] = ((cds.values - factor.values) ** 2).sum(1) ** .5

ids = df.filter(like='id')
cds = df.filter(like='cd')  
factor = df.filter(like='Factor')

df['id_distance'] = ((ids.values - factor.values) ** 2).sum(1) ** .5
df['cs_distance'] = ((cds.values - factor.values) ** 2).sum(1) ** .5
df 
   id_X  id_Y  cd_X  cd_Y  Factor_X  Factor_Y  id_distance  cs_distance
0     1     2     3     2        10         2     9.000000          7.0
1     2     5     3     5        20         5    18.000000         17.0
2     7     5     8     6        30         6    23.021729         22.0
3    19     7    20     7        20         7     1.000000          0.0