【发布时间】:2020-12-21 05:20:53
【问题描述】:
我需要创建一个由代表点之间距离的列表组成的列。我正在尝试以一种列表理解或最有效的方式创建此距离列表。
这里是开始数据框df
ID list_1 list_2
00 [(10,2),(5,7)] [(11,3),(9,9)]
01 [(1,7)] [(9,1)(2,1),(6,3)]
02 [(4,2),(9,4)] [(3,7)]
这是我想要的结尾 df 数据框。基本上对于每一行,list_2 列中的每个元组都需要找到它自己与list_1 列中的每个元组之间的距离。
ID list_1 list_2 distances
00 [(10,2),(5,7)] [(11,3),(9,9)] [[1.41,7.21],[7.07,4.47]]
01 [(1,7)] [(9,1)(2,1)] [[10.0,6.08]]
在达到最终目标之前,我最终会进行六次列表推导,但我确信有更有效的方法。
我在做什么:
import pandas as pd
import math
第一步
df['x'] = [[s[1] for s in object_slice] for object_slice in df['list_1']]
第二步
df['y'] = [[s[1] for s in object_slice] for object_slice in df['list_1']]
第三步
df['dist_p1'] = [[(df['x'][a] - s[1],df['y'][a] - s[0]) for s in object_slice]for a, object_slice in enumerate(df['list_2'])]
第四步
df['dist_p2'] = [[s[0] for s in object_slice] for object_slice in df['dist_p1']]
第 5 步
df['dist_p3'] = [[s[1] for s in object_slice] for object_slice in df['dist_p1']]
第 6 步
df['distances'] = [[[round(math.hypot(s2,df['dist_p2'][a][b][c]),2) for c, s2 in enumerate(s)] for b,s in enumerate(object_slice)] for a, object_slice in enumerate(df['dist_p1'])]
【问题讨论】:
-
在 list1 或 list2(或两者)中有多个点的地方:您希望输出的结构如何? list1 中每个点的子列表,还是 list2 中每个点的子列表?
标签: python pandas list-comprehension euclidean-distance