【问题标题】:Pandas Google Distance Matrix API - Pass coordinates into URLPandas Google 距离矩阵 API - 将坐标传递到 URL
【发布时间】:2017-08-21 19:29:42
【问题描述】:

我正在使用 Google 距离矩阵 API,我想将数据帧中的坐标输入 API 并返回两点之间的持续时间和距离。 这是我的数据框:

import pandas as pd
import simplejson
import urllib
import numpy as np

Record   orig_lat    orig_lng       dest_lat     dest_lng      
1        40.7484405  -74.0073127    40.7115242   -74.0145492   
2        40.7421218  -73.9878531    40.7727216   -73.9863531   

首先,我需要将 orig_lat & orig_lngdest_lat & dest_lng 组合成字符串,然后传入网址。所以我尝试创建变量 orig_coorddest_coord 然后将它们传递到 URL 并返回值:

orig_coord = df[['orig_lat','orig_lng']].apply(lambda x: '{},{}'.format(x[0],x[1]), axis=1)
dest_coord = df[['dest_lat','dest_lng']].apply(lambda x: '{},{}'.format(x[0],x[1]), axis=1)

for row in df.itertuples():
    url = "http://maps.googleapis.com/maps/api/distancematrix/json?origins={0}&destinations={1}&units=imperial&MYGOOGLEAPIKEY".format(orig_coord,end_coord)
    result = simplejson.load(urllib.urlopen(url))
    df['driving_time_text'] = result['rows'][0]['elements'][0]['duration']['text']

但我收到以下错误:“TypeError: () got an unexpected keyword argument 'axis'”

所以我的问题是:如何将两列中的值连接成一个字符串,然后将该字符串传递给一个 URL 并输出结果?

提前谢谢你!

【问题讨论】:

    标签: python json google-maps pandas urllib


    【解决方案1】:

    嗯,我不确定您是如何构建数据框的。也许发布这些细节?但是,如果您可以忍受在位置上引用元组元素,这对我有用:

    import pandas as pd
    
    data = [{'orig_lat': 40.748441, 'orig_lng': -74.007313, 'dest_lat': 40.711524, 'dest_lng': -74.014549}, 
            {'orig_lat': 40.742122, 'orig_lng': -73.987853, 'dest_lat': 40.772722, 'dest_lng': -73.986353}]
    df = pd.DataFrame(data)
    for row in df.itertuples():
     orig_coord='{},{}'.format(row[1],row[2])
     dest_coord='{},{}'.format(row[3],row[4])
     url = "http://maps.googleapis.com/maps/api/distancematrix/json?origins={0}&destinations={1}&units=imperial&MYGOOGLEAPIKEY".format(orig_coord,dest_coord)
     print url
    

    生产

    http://maps.googleapis.com/maps/api/distancematrix/json?origins=40.748441,-74.007313&destinations=40.711524,-74.014549&units=imperial&MYGOOGLEAPIKEY
    http://maps.googleapis.com/maps/api/distancematrix/json?origins=40.742122,-73.987853&destinations=40.772722,-73.986353&units=imperial&MYGOOGLEAPIKEY
    

    要使用结果更新数据框,因为row 是一个元组且不可写,您可能希望在迭代时跟踪当前索引。也许是这样的:

    data = [{'orig_lat': 40.748441, 'orig_lng': -74.007313, 'dest_lat': 40.711524, 'dest_lng': -74.014549, 'result': -1}, 
            {'orig_lat': 40.742122, 'orig_lng': -73.987853, 'dest_lat': 40.772722, 'dest_lng': -73.986353, 'result': -1}]
    df = pd.DataFrame(data)
    i_row = 0
    for row in df.itertuples():
     orig_coord='{},{}'.format(row[1],row[2])
     dest_coord='{},{}'.format(row[3],row[4])
     url = "http://maps.googleapis.com/maps/api/distancematrix/json?origins={0}&destinations={1}&units=imperial&MYGOOGLEAPIKEY".format(orig_coord,dest_coord)
     # Do stuff to get your result
     df['result'][i_row] = result
     i_row++
    

    【讨论】:

    • 我对其进行了编辑以显示一种更新数据框的方法......但当然还有其他方法可以做到这一点。
    • 嗨,迈克,感谢您的帮助。这仍然无法为我工作。我认为这与 i_row 有关。你还有其他建议吗?我一直在四处寻找,找不到太多。
    • 我忘记了一行,i_row++ ... 有帮助吗?
    • 这不太奏效,但我能够通过创建一个列表并使用 list.append(result) 找到解决方法。我怀疑这是否是最有效的方法,但它适用于此目的。再次感谢迈克!
    • 我应该说i += 1,而不是i++——python没有++--递增和递减运算符。很高兴您找到了可行的解决方案!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-20
    • 2012-05-09
    • 2019-12-10
    • 2012-06-13
    相关资源
    最近更新 更多