We have two points in Cartesian space as origins and some other typical points. For typical points we are only interested in their distance from the origins: two numbers. so we want reach from df
d = {'origin1': [(1,0,0), (0,0,0)], 'origin2': [(2,0,0), (0,0,1)], 'point1': [(40,0,0), (0,0,20)], 'point2': [(50,0,0), (0,0,25)], 'point3': [(60,0,0), (0,0,30)]} display(pd.DataFrame(data=d, index=[0, 1]))
to df
d = {'origin1': [(1,0,0), (0,0,0)], 'origin2': [(2,0,0), (0,0,1)], 'point1': [(39,38), (20,19)], 'point2': [(49,48), (25,24)], 'point3': [(59,58), (30,29)]} display(pd.DataFrame(data=d, index=[0, 1]))
Of course here we chose simple number for simple distance to see the problem. in general case we should use Pythagorean distance formula.
Advertisement
Answer
It’s a solution for arbitrary dimensions of points & number of origins that we may have:
d = {'origin1': [(1,0,0) , (0,0,0 )], 'origin2': [(2,0,0) , (0,0,1 )], 'point1' : [(40,0,0), (0,0,20)], 'point2' : [(50,0,0), (0,0,25)], 'point3' : [(60,0,0), (0,0,30)]} df_pnt = pd.DataFrame(data=d, index=[0, 1]) df_pnt
First we define some functions:
import pandas as pd def distance(p1, p2): ''' Calculate the distance between two given points Arguments: p1, p2: points Returns: Distance of points ''' dmn = min(len(p1), len(p2)) vct = ((p1[i] - p2[i])**2 for i in range(dmn)) smm = sum(vct) dst = smm**.5 return dst def distances(df, n): ''' Calculate the distances between points & origins Arguments: df: dataframe of points including origins n : number of origins Returns: dataframe of distances ''' df_dst = df.iloc[:, :n] for column in df.columns[n:]: df_dst[column] = df.apply(lambda row: tuple(distance(row[origin], row[column]) for origin in df.columns[:n]), axis=1) return df_dst
Now this script gives your desired output:
distances(df_pnt, 2)
I hope it be what you want.