首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用多个输入将迭代重写为.apply函数

用多个输入将迭代重写为.apply函数
EN

Stack Overflow用户
提问于 2021-11-03 12:18:19
回答 1查看 72关注 0票数 0

我有两个DataFrames。一个包含几个发电厂及其各自的位置,按经度和纬度,每一个列。另一个dataframe包含几个变电站,也有long和lat。我想做的是把发电厂分配到最近的变电站。

代码语言:javascript
运行
复制
df1 = pd.DataFrame{'ID_pp':['p1','p2','p3','p4'],'x':[12.644881,11.563269, 12.644881,  8.153184], 'y':[48.099206, 48.020081, 48.099206, 49.153766]}
df2 = pd.DataFrame{'ID_ss':['s1','s2','s3','s4'],'x':[9.269, 9.390, 9.317, 10.061], 'y':[55.037, 54.940, 54.716, 54.349]}

我找到了这个解决方案,这基本上就是我所需要的:

代码语言:javascript
运行
复制
import pandas as pd
import geopy.distance



for i,row in df1.iterrows(): # A
    a = row.x, row.y
    distances = []
    for j,row2 in df2.iterrows(): # B
        b = row2.x, row2.y
        distances.append(geopy.distance.geodesic(a, b).km)

    min_distance = min(distances)
    min_index = distances.index(min_distance)

 
    df1['assigned_to'] =  min_index

它可以工作,但是它非常慢,而且我的数据集相当大。我认为使用.apply的方法要快得多,但我真的想不出一种使用它的方法。有没有人知道如何将上述函数重写为不需要迭代的.apply方法?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-11-03 13:32:14

解决方案8x (受this topic启发):

代码语言:javascript
运行
复制
def closest_node(node, nodes):
    nodes = np.asarray(nodes)
    deltas = nodes - node
    dist_2 = np.einsum('ij,ij->i', deltas, deltas)
    return np.argmin(dist_2)

df2_array = df2[["x","y"]].values

df1['assigned_to'] = df1.apply(lambda x: closest_node2(np.array([x.x, x.y]),df2_array) ,axis=1)

速度比较:

在此之前:

代码语言:javascript
运行
复制
%%timeit
for i,row in df1.iterrows(): # A
    a = row.x, row.y
    distances = []
    for j,row2 in df2.iterrows(): # B
        b = row2.x, row2.y
        distances.append(geopy.distance.geodesic(a, b).km)

    min_distance = min(distances)
    min_index = distances.index(min_distance)

 
    df1['assigned_to'] =  min_index

给出8.75 ms ± 108 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

之后:

代码语言:javascript
运行
复制
%%timeit
df2_array = df2[["x","y"]].values

df1['assigned_to'] = df1.apply(lambda x: closest_node2(np.array([x.x, x.y]),df2_array) ,axis=1)

给出1.7 ms ± 31.2 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69824710

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档