我使用Pandas和PyProj将东向和北向转换为经度和纬度,然后将拆分输出保存为2列,如下所示......
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 | |
1条答案
按热度按时间zf9nrax11#
因为题材的关系,我想我们是只见树木不见森林。如果我们查看
transform
的文档,您将看到:很好,numpy数组正是我们所需要的。
pd.DataFrame
可以被认为是数组的字典,所以我们只需要隔离这些列并将它们传递给函数。这里有一个小问题-DataFrame
的列将是Series
,transform
将拒绝它,所以我们只需要使用values
属性。这个小例子直接等同于你最初的方法:我们就结束了除此之外,我们可以看看100行的计时(当前的方法在我通常的100,000行计时示例中爆炸):
提供: