从MapQuest反向地理编码数据中解析信息

时间:2015-08-12 16:31:56

标签: python parsing if-statement pandas

大家好,所以我在解析我对Mapquest API的查询中的信息时遇到了问题。我试图解析我的geocode_data列中的数据并放入单独的列。我试图在下面的地理编码数据中专门提取地址以下组件。粗体字是我想要提取的东西。

'providedLocation':{'latLng':{'lat':52.38330319,'lng':4.7959011}},'locations':[{'adminArea6Type':'邻里','街道':(4 )'25 Philip Vingboonsstraat','adminArea4Type':'县','adminArea3Type':'州',' displayLatLng':( 9){'lat':52.383324,(10){'lng ':4.795784} ,(7)'adminArea3':'Noord-Holland','adminArea1Type':'国家','linkId':'0','adminArea4':'MRA','dragPoint':错误,'mapUrl':'http://www.mapquestapi.com/staticmap/v4/getmap?key=Cxk9Ng7G6M8VlrJytSZaAACnZE6pG3xp&type=map&size=225,160&pois=purple-1,52.3833236,4.7957837,0,0,|&center=52.3833236,4.7957837&zoom=15&rand=-152222465','type':'s','(5)postalCode':'1067BG','latLng':{'lat':52.383324,'lng':4.795784} ,(6)'adminArea5':'Amsterdam','adminArea6':'Amsterdam','geocodeQuality':'ADDRESS','unknownInput':'','adminArea5Type':'City','geocodeQualityCode':'L1AAA' ,( 8)'adminArea1':'NL','sideOfStreet':'N'}]}

我已经尝试构建我的代码,但我一直在获取KeyErrors。任何人都可以修复我的代码,以便我能够为我的研究提取不同的地址组件。谢谢!我的代码是正确的,直到位置到达终点。然后我收到了一个关键错误。

import pandas as pd
import json
import requests 

df = pd.read_csv('/Users/albertgonzalobautista/Desktop/Testing11.csv')

df['geocode_data'] = ''
df['address']=''
df['st_pr_mn']= ' '

def reverseGeocode(latlng):
    result = {}
    url = 'http://www.mapquestapi.com/geocoding/v1/reverse?key={1}&location={0}'
    apikey = 'Cxk9Ng7G6M8VlrJytSZaAACnZE6pG3xp'
    request = url.format(latlng, apikey)
    data = json.loads(requests.get(request).text)
    if len(data['results']) > 0:
        result = data['results'][0]
    return  result


for i, row in df.iterrows():
    df['geocode_data'][i] = reverseGeocode(df['lat'][i].astype(str) + ',' + df['lon'][i].astype(str))

for i, row in df.iterrows():
    if 'locations' in row['geocode_data']:
        for component in row['locations']:
            print (row['locations'])
            df['st_pr_mn'][i] = row['adminArea3']

1 个答案:

答案 0 :(得分:1)

首先,根据您的if条件,locationsrow['geocode_data']中的关键,因此您应该尝试row['geocode_data']['locations'],而不是row['locations'],这很可能是你获得KeyError的原因。

然后根据您在OP中给出的json,似乎locations键存储了一个列表,因此迭代每个元素(就像您现在所做的那样)并从component获取所需的元素不是row。示例 -

for i, row in df.iterrows():
    if 'locations' in row['geocode_data']:
        for component in row['geocode_data']['locations']:
            print (row['geocode_data']['locations'])
            df['st_pr_mn'][i] = component['adminArea3']

虽然这会为df['st_pr_mn'][i]列表中的每个字典用component['adminArea3']的新值覆盖row['geocode_data']['locations']。如果列表中只有一个元素,那么它很好,否则你将不得不决定如何存储多个值,也许可以使用一个列表。