3

I'm trying to parse the JSON response from the GoogleMaps API to read values from a nested dict into a Pandas DataFrame. The structure of the JSON response is shown below.

I'm trying to create a DataFrame called 'address_components' with ('types', 'short_name', 'long_name') as the column headers and the respective values from each address query as rows.

I've tried to use ijson:

from ijson import items
import ijson
f = urlopen('https://maps.googleapis.com/maps/api/geocode/json?address=2022+Boren+Ave%2C+Seattle+98101')

objects = list(ijson.items(f, 'results.address_components'))

objects

Out: []

My problem is successfully traversing the nested dicts.

I've also reviewed the GoogleMaps GeoLocator API Documentation, and the GoogleMaps JSON parsing docs. This solution seems to solve the problem, but on IOS

Not helping me to reach into the nest...

    "results" : [
      {
         "address_components" : [
            {
               "long_name" : "1600",
               "short_name" : "1600",
               "types" : [ "street_number" ]
            },
            {
               "long_name" : "Amphitheatre Pkwy",
               "short_name" : "Amphitheatre Pkwy",
               "types" : [ "route" ]
            },
            {
               "long_name" : "Mountain View",
               "short_name" : "Mountain View",
               "types" : [ "locality", "political" ]
            },
            {
               "long_name" : "Santa Clara County",
               "short_name" : "Santa Clara County",
               "types" : [ "administrative_area_level_2", "political" ]
            },
            {
               "long_name" : "California",
               "short_name" : "CA",
               "types" : [ "administrative_area_level_1", "political" ]
            },
            {
               "long_name" : "United States",
               "short_name" : "US",
               "types" : [ "country", "political" ]
            },
            {
               "long_name" : "94043",
               "short_name" : "94043",
               "types" : [ "postal_code" ]
            }
         ],
         "formatted_address" : "1600 Amphitheatre Parkway, Mountain View, CA 94043, USA",
         "geometry" : {
            "location" : {
               "lat" : 37.4224764,
               "lng" : -122.0842499
            },
            "location_type" : "ROOFTOP",
            "viewport" : {
               "northeast" : {
                  "lat" : 37.4238253802915,
                  "lng" : -122.0829009197085
               },
               "southwest" : {
                  "lat" : 37.4211274197085,
                  "lng" : -122.0855988802915
               }
            }
         },
         "place_id" : "ChIJ2eUgeAK6j4ARbn5u_wAGqWA",
         "types" : [ "street_address" ]
      }
   ],
   "status" : "OK"
}

1 Answer 1

1

you can use json_normalize() for that::

import requests
import json
import pandas as pd

url = 'https://maps.googleapis.com/maps/api/geocode/json?address=2022+Boren+Ave%2C+Seattle+98101'

r = requests.get(url)

if r.status_code != requests.codes.ok:
    r.raise_for_status()

results = json.loads(r.text)

df = pd.io.json.json_normalize(results['results'], 'address_components')

print(df)

Test:

In [17]: pd.io.json.json_normalize(results['results'], 'address_components')
Out[17]:
       long_name   short_name                                     types
0           2022         2022                           [street_number]
1   Boren Avenue    Boren Ave                                   [route]
2       Belltown     Belltown                 [neighborhood, political]
3        Seattle      Seattle                     [locality, political]
4    King County  King County  [administrative_area_level_2, political]
5     Washington           WA  [administrative_area_level_1, political]
6  United States           US                      [country, political]
7          98121        98121                             [postal_code]
Sign up to request clarification or add additional context in comments.

1 Comment

Fantastic! Thank you so much. This is exactly what I was looking for. Apparently I'm not yet allowed to say so officially as when I checked the box it told me I wasn't a credible respondent to my question... In any case, thanks very much.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.