对于位置的大型数据帧,将东距和北距快速转换为纬度和经度

2024-07-01 08:27:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用Pandas和PyProj将东距和北距转换为Longitute和latitude,然后将分割的输出保存为两列,如下所示

v84 = Proj(proj="latlong",towgs84="0,0,0",ellps="WGS84")
v36 = Proj(proj="latlong", k=0.9996012717, ellps="airy",
        towgs84="446.448,-125.157,542.060,0.1502,0.2470,0.8421,-20.4894")
vgrid = Proj(init="world:bng")


def convertLL(row):

    easting = row['easting']
    northing = row['northing']

    vlon36, vlat36 = vgrid(easting, northing, inverse=True)

    converted = transform(v36, v84, vlon36, vlat36)

    row['longitude'] = converted[0]
    row['latitude'] = converted[1]

    return row


values = pd.read_csv("values.csv")
values = values.apply(convertLL, axis=1)

这是可行的,但速度非常慢,在较大的数据集上超时。为了改善情况,我尝试将其转换为使用lamba函数,以期加快速度。到目前为止我有这个

def convertLL(easting, northing):

    vlon36, vlat36 = vgrid(easting, northing, inverse=True)

    converted = transform(v36, v84, vlon36, vlat36)

    row = row['longitude'] = converted[0]

    return row


values ['longitude'] = values.apply(lambda row: convertLL(row['easting'], row['northing']), axis=1)

这个转换后的版本正在工作,比我的旧版本更快,在更大的数据集上不会超时,但这只适用于经度,有没有办法让它也适用于纬度

还有,这是矢量化的吗?我能再加快速度吗

编辑

数据样本

name | northing | easting | latitude | longitude
------------------------------------------------
tl1  | 378778   | 366746  |          |
tl2  | 384732   | 364758  |          |

Tags: 数据rowprojvaluesconvertedlatitudelongitudevgrid
1条回答
网友
1楼 · 发布于 2024-07-01 08:27:30

因为主题的关系,我想我们看不见树木。如果我们看一下the docs for ^{},你会看到:

  • xx (scalar or array (numpy or python)) – Input x coordinate(s).
  • yy (scalar or array (numpy or python)) – Input y coordinate(s).

伟大的;numpy阵列正是我们所需要的。一个pd.DataFrame可以看作是数组的字典,所以我们只需要隔离这些列并将它们传递给函数。有一个很小的catch-columns的DataFrame将是一个Series,它将被transform拒绝,所以我们只需要使用values属性。这个小例子直接等同于您最初的方法:

def vectorized_convert(df):
    vlon36, vlat36 = vgrid(df['easting'].values, 
                           df['northing'].values, 
                           inverse=True)
    converted = transform(v36, v84, vlon36, vlat36)
    df['longitude'] = converted[0]
    df['latitude'] = converted[1]
    return df

df = pd.DataFrame({'northing': [378778, 384732],
                   'easting': [366746, 364758]})

print(vectorized_convert(df))

我们完成了。除此之外,我们可以查看100行的计时(当前的方法针对我通常的100000行的计时示例):

def current_way(df):
    df = df.apply(convertLL, axis=1)
    return df


def vectorized_convert(df):
    vlon36, vlat36 = vgrid(df['easting'].values, 
                           df['northing'].values, 
                           inverse=True)

    converted = transform(v36, v84, vlon36, vlat36)
    df['longitude'] = converted[0]
    df['latitude'] = converted[1]
    return df


df = pd.DataFrame({'northing': [378778, 384732] * 50,
                   'easting': [366746, 364758] * 50})

给出:

%timeit current_way(df)
289 ms ± 15.2 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

%timeit vectorized_convert(df)
2.95 ms ± 59.8 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

相关问题 更多 >

    热门问题