【问题标题】:iterate a value of a row of a dataframe with each value of a column in another用另一列中的每个值迭代数据框的一行的值
【发布时间】:2018-10-16 18:07:00
【问题描述】:

我正在尝试将 df1 的每一行与 df2 的每一行循环,并在 df1 中创建一个新的 col 并将最小值(所有值)存储在其中。

lat_sc= shopping_centers['lat']
long_sc= shopping_centers['lng']
for i, j in zip(lat_sc,long_sc):
    for lat_real, long_real in zip(real_estate['lat'],real_estate['lng']):
        euclid_dist.append( lat_real - i)
        short_dist.append(min(euclid_dist))
        euclid_dist = []

结果: df1['shortest'] = min(df1['lat']- each lat of df2)

df1['nearest sc'] = 对应的sc_id

编辑以在 df1 中包含 sc_id

【问题讨论】:

    标签: python list loops dataframe


    【解决方案1】:

    随着 df2 变大,这可能会变得计算密集,但您可以像这样找到 df1 距离和所有 df2 距离的差异(可以更有效地做到这一点)

    def find_euclid_dist(row):
        dist_arr = np.sqrt((ref_lats - row["lat"])**2 + (ref_longs - row["lng"])**2)
        return np.min(dist_arr)
    
    ref_lats = df2["lat"].values
    ref_longs = df2["lng"].values
    df1["shortest"] = df1.apply(find_euclid_dist, axis=1)
    

    【讨论】:

    • 我们如何迭代 df1 的每个元素,好像 x['lat'] 和 x['long'] 指的是 df1
    • 我把我的名字 x 和 row 弄混了,请看我的编辑。当我们在内部使用 apply 时,它会遍历每一行并执行定义的函数
    • 我正在使用两个数据帧头部的代码并且它没有采用正确的索引:KeyError: ('lat', 'occured at index addr_street')
    • 抱歉,我匆忙做了其他事情,axis=1 参数应该使函数按行而不是按列执行,请参阅编辑
    • 谢谢!这工作正常,但我也想要这个最短距离的购物 id
    【解决方案2】:

    如何使用cdist from scipy

    from scipy.spatial.distance import cdist
    
    df1['shortest'] = cdist(df1[['lat','lng']], df2[['lat','lng']], metric='euclidean').min(1)
    

    print(df1) 返回:

             lat        lng          addr_street    shortest
    0 -37.980523 -37.980523     37 Scarlet Drive  183.022436
    1 -37.776161 -37.776161  999 Heidelberg Road  182.817951
    2 -37.926238 -37.926238        47 New Street  182.968096
    3 -37.800056 -37.800056  3/113 Normanby Road  182.841849
    

    【讨论】:

      猜你喜欢
      • 2022-01-03
      • 1970-01-01
      • 1970-01-01
      • 2022-07-05
      • 2021-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多