【问题标题】:Save the minimum value of a nested for loop to Pandas Dataframe将嵌套 for 循环的最小值保存到 Pandas Dataframe
【发布时间】:2022-01-15 00:46:47
【问题描述】:

我正在尝试计算从 Dataframe 中列的每个点(坐标)到另一个 Dataframe 中另一列的每个点(坐标)的距离,并将最小距离保存到 Dataframe,以便生成的 Dataframe 具有与第一列长度相同。 数据: 实习生:

ID coordinates
1 (50.939266, 6.934996)
2 (50.935998, 6.931481)

360 个条目

停止:

Name coordinates
A (50.93576, 6.96046)
B (50.9357, 6.95957)

2082 个条目

想要的结果:

ID coordinates min_distance
1 (50.939266, 6.934996) 1.8263939732112
2 (50.935998, 6.931481) 0.3

intern:3 列,每列 360 个条目,其中最后一列是第二列中的坐标到停靠点 Dataframe 的每个坐标的最小距离

我试过了:

intern_index = 0
stops_index = 0
min_distance = 99999


hs.haversine((50.939266, 6.934996), (50.93576, 6.96046), unit=Unit.KILOMETERS)
Out: 1.8263939732112031

for i in intern['coordinates']:
     
    
    for j in stops['coordinates']:
         
        new_distance = hs.haversine(i, j, unit=Unit.KILOMETERS)
        
        if new_distance < new_distance:
            min_distance = new_distance
             
            
    intern['min_distance'] = min_distance 

这会产生:

ID coordinates min_distance
1 (50.939266, 6.934996) 22.941973
2 (50.935998, 6.931481) 22.941973

为什么它不保存正确的值?即使第一次尝试也小于这个值,也不能都是相同的距离

【问题讨论】:

  • 坐标列是用元组还是字符串填充?
  • 这是因为您将min_distance 声明为None。将min_distance 声明为一个较大的值,例如 99999999。
  • @KelvinDucray 它充满了元组....haversine 函数可以找到
  • @TheFlyingObject 有效,但现在我的 min_distance 列的每一行都有相同的条目:/
  • 删除for x in min_distance:min_distance 是数字,不是可迭代的。

标签: python pandas dataframe loops nested


【解决方案1】:

我建议以矢量化形式实现您想要的,因为它更快。 Numpy 在您需要的计算方面非常高效。

初始化一些测试数据:

df_1 = pd.DataFrame({"ID": [1, 2], 
                     "coordinates": [(1.0, 0.0), (-0.5, 0.0)]})
df_1.set_index("ID", inplace=True)
df_2 = pd.DataFrame({"Name": ["A", "B", "C"], 
                     "coordinates": [(1.0, 0.0), (0.0, 0.0), (-1.0, 0.0)]})
df_2.set_index("Name", inplace=True)

Vectorizing Haversine distance calculation in Python 的帮助下,编写了两个输入集合的每对之间的向量化版本的半正弦距离计算:

def haversine(df_1, df_2):
    np_1 = np.array(df_1['coordinates'].tolist())
    np_2 = np.array(df_2['coordinates'].tolist())
    np_1 = np.deg2rad(np_1)
    np_2 = np.deg2rad(np_2)        
    diff_lat = np_1[:, 0, None] - np_2[:, 0]
    diff_lng = np_1[:, 1, None] - np_2[:, 1]
    d = np.sin(diff_lat/2)**2 + np.cos(np_1[:, 0, None])*np.cos(np_2[:, 0]) * np.sin(diff_lng/2)**2
    return 2 * 6371 * np.arcsin(np.sqrt(d))

申请:

df_1["min_haversine_dist"] = np.min(haversine(df_1, df_2), axis=1)
df_1.head()

返回:

    ID, coordinates,    min_haversine_dist  
    1   (1.0, 0.0)  0.000000
    2   (-0.5, 0.0) 55.597463

注意。 我个人的经验法则:如果我在数据帧上循环我做错了,如果我在数据帧中的记录上有一个嵌套循环我在做某事完全错了。

【讨论】:

    猜你喜欢
    • 2018-03-16
    • 2019-05-10
    • 2019-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-24
    • 1970-01-01
    • 2021-06-10
    相关资源
    最近更新 更多