【问题标题】:Function to convert coordinates in pandas series and append as additional series转换熊猫系列中的坐标并附加为附加系列的功能
【发布时间】:2016-08-19 12:13:37
【问题描述】:

我希望将存储在 Pandas 数据框中的一系列坐标作为存储在 Pandas 数据框中的坐标,并定义一个函数,该函数将遍历每个条目,将其转换(BNG 东北向经纬度)并将其保存到新列同一行。 Elise Huard 的 function 看起来应该这样做

def proj_transform(df):
    #bng = pyproj.Proj(init='epsg:27700')
    bng = pyproj.Proj("+init=EPSG:27700")
    #wgs84 = pyproj.Proj(init='epsg:4326')
    wgs84 = pyproj.Proj("+init=EPSG:4326")
    lats = pd.Series()
    lons = pd.Series()
    for idx, val in enumerate(df['Easting']):
        lon, lat = pyproj.transform(bng,wgs84,df['Easting'][idx], df['Northing'][idx])
        lats.set_value(idx, lat)
        lons.set_value(idx, lon)
    df['lat'] = lats
    df['lon'] = lons
    return df

但是一旦我尝试运行该函数,我就会收到以下错误。关于可能导致它的任何建议或替代方法作为工作回合。

RuntimeError: non-convergent inverse meridional dist

使用的数据样本;

Site Reference  LA Reference    Start Date  Easting Northing
0   380500145   NaN 20130101    105175.0    105175.0
1   380500128   NaN 20060331    104000.0    104000.0
2   380500085   NaN 20030401    105055.0    105055.0
3   380500008   NaN 19980930    108480.0    108480.0
4   380500009   NaN 19980930    105415.0    105415.0
5   380500136   SHLAA20100101   105081.0    105081.0
6   380500038   NaN 19980930    105818.0    105818.0

【问题讨论】:

  • 如果您添加一些产生此错误的小输入数据框可能会有所帮助。
  • ...包括出现错误的行。

标签: python pandas geocoding


【解决方案1】:

我认为该功能工作正常,但您输入的格式是罪魁祸首。在样本数据的第五行中,SHLAA 和日期之间没有空格 - 它们作为一个表达式进入 LA Ref 列,而northings 列得到NaN。这个NaN 值在函数pyproj.transform 中产生RuntimeError: b'non-convergent inverse meridional dist'

在那里添加一个空格,加上一些需要的列名重新格式化后,它工作正常(或者至少看起来如此)。

我的代码:

import pandas as pd
import pyproj
from inspect import cleandoc
from io import StringIO

s = '''
    Site_Reference  LA_Reference    Start_Date  eastings northings
    0   380500145   NaN 20130101    105175.0    105175.0
    1   380500128   NaN 20060331    104000.0    104000.0
    2   380500085   NaN 20030401    105055.0    105055.0
    3   380500008   NaN 19980930    108480.0    108480.0
    4   380500009   NaN 19980930    105415.0    105415.0
    5   380500136   SHLAA 20100101   105081.0    105081.0
    6   380500038   NaN 19980930    105818.0    105818.0
    '''
s = cleandoc(s)
df = pd.read_csv(StringIO(s), sep = '\s+')
print(df)
   Site_Reference LA_Reference  Start_Date  eastings  northings
0       380500145          NaN    20130101    105175     105175
1       380500128          NaN    20060331    104000     104000
2       380500085          NaN    20030401    105055     105055
3       380500008          NaN    19980930    108480     108480
4       380500009          NaN    19980930    105415     105415
5       380500136        SHLAA    20100101    105081     105081
6       380500038          NaN    19980930    105818     105818

def proj_transform(df):
    bng = pyproj.Proj("+init=EPSG:27700")
    wgs84 = pyproj.Proj("+init=EPSG:4326")
    lats = pd.Series()
    lons = pd.Series()
    for idx, val in enumerate(df['eastings']):
        lon, lat = pyproj.transform(bng,wgs84,df['eastings'][idx], df['northings'][idx])
        lats.set_value(idx, lat)
        lons.set_value(idx, lon)
    df['lat'] = lats
    df['lon'] = lons
    return df

df_transformed = proj_transform(df)

print(df_transformed)
   Site_Reference LA_Reference  Start_Date  eastings  northings        lat       lon
0       380500145          NaN    20130101    105175     105175  50.771035 -6.183048
1       380500128          NaN    20060331    104000     104000  50.759899 -6.198721
2       380500085          NaN    20030401    105055     105055  50.769898 -6.184649
3       380500008          NaN    19980930    108480     108480  50.802348 -6.138924
4       380500009          NaN    19980930    105415     105415  50.773309 -6.179846
5       380500136        SHLAA    20100101    105081     105081  50.770144 -6.184302
6       380500038          NaN    19980930    105818     105818  50.777128 -6.174468

【讨论】:

  • 我不知道检查和 cleandoc,听起来很有帮助。到目前为止还没有工作,但我想我明白你的意思我的东向和北向不应该像他们那样附加 .00。如果我只想从这两列中阅读,您能否更详细地解释您的答案,为什么其他列中发生的事情会有所不同?
  • 已解决;您的回答是一个提示,我的专栏中有一些 NaN
【解决方案2】:

假设 pyproj.transform 在单个(东、北)坐标对上正常工作,则代替:

for idx, val in enumerate(df['Easting']):
    lon, lat = pyproj.transform(bng,wgs84,df['Easting'][idx], df['Northing'][idx])
    lats.set_value(idx, lat)
    lons.set_value(idx, lon)

试试:

lons, lats = map(lambda x: pyproj.transform(bng, wgs84, x[0], x[1]),
                 zip(df['Easting'], df['Northing']))

其余的保持不变。

编辑

这行得通:

arr = map(lambda x: pyproj.transform(bng, wgs84, x[0], x[1]),
          zip(df['eastings'], df['northings']))
lons, lats = map(array, zip(*arr)) 

【讨论】:

  • 您还应该能够删除 lats 和 lons 初始化行。您可以在 Pandas 中使用数组隐式定义系列。
  • 没看懂答案,在for之后,原函数中的新代码应该放在哪里
  • 它替换了循环。 map 函数负责处理它。应该快得多。试试看吧。
  • 谢谢,这两个功能都试过了(@ptrj 修复数据和你的)我现在挂断了ValueError: too many values to unpack 只有 8835 个条目
  • link 为好奇的人写入 csv 的熊猫日期框架
【解决方案3】:

正如@ptrj 所说;

RuntimeError: non-convergent inverse meridional dist

在这种情况下,是由数据中的 NaN 值引起的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-07-11
    • 2019-10-01
    • 2018-02-28
    • 2018-02-03
    • 2015-06-16
    • 2019-11-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多