Search code examples
pythonarraysdictionaryfor-loopherepy

For loop in a dictionary inside a dictionary for dataframe construction in herepy (PlacesAPI)


I am using Python and I am trying to access the result of function PlacesAPI where I can see supermarkets around me and create a dataframe with few parts of each dictionary inside the main dictionary using a for loop, however I am getting the same information for different rows.

Can you please help me to put each different parts of dictionary in a different row?

Here is my code and the result (now reproducible):

    from herepy import PlacesApi
    import pandas as pd

def dataframe():

    a = {'items': [{'title': 'Marcos Francisco dos Santos Padaria e Mercearia',
   'id': 'here:pds:place:07675crc-dfd72cbf57bd45cc9277ed8530ffd61b',
   'ontologyId': 'here:cm:ontology:supermarket',
   'resultType': 'place',
   'address': {'label': 'Marcos Francisco dos Santos Padaria e Mercearia, Rua Oswero Carmo Vilaça, 33, Petrópolis - RJ, 25635-101, Brazil',
    'countryCode': 'BRA',
    'countryName': 'Brazil',
    'stateCode': 'RJ',
    'state': 'Rio de Janeiro',
    'city': 'Petrópolis',
    'district': 'Petrópolis',
    'street': 'Rua Oswero Carmo Vilaça',
    'postalCode': '25635-101',
    'houseNumber': '33'},
   'position': {'lat': -22.5315, 'lng': -43.16904},
   'access': [{'lat': -22.5314, 'lng': -43.16914}],
   'distance': 134,
   'categories': [{'id': '600-6300-0066', 'name': 'Grocery', 'primary': True},
    {'id': '600-6300-0244', 'name': 'Bakery & Baked Goods Store'}],
   'contacts': [{'phone': [{'value': '+552422312493'}]}]},
  {'title': 'Mr. Frango',
   'id': 'here:pds:place:076jx7ps-7c214f50052f0c23c9e5422ebde7d3cd',
   'ontologyId': 'here:cm:ontology:supermarket',
   'resultType': 'place',
   'address': {'label': 'Mr. Frango, Rua Teresa, Petrópolis - RJ, 25635-530, Brazil',
    'countryCode': 'BRA',
    'countryName': 'Brazil',
    'stateCode': 'RJ',
    'state': 'Rio de Janeiro',
    'city': 'Petrópolis',
    'district': 'Petrópolis',
    'street': 'Rua Teresa',
    'postalCode': '25635-530'},
   'position': {'lat': -22.52924, 'lng': -43.17222},
   'access': [{'lat': -22.52925, 'lng': -43.1722}],
   'distance': 545,
   'categories': [{'id': '600-6300-0066', 'name': 'Grocery', 'primary': True},
    {'id': '600-6000-0061', 'name': 'Convenience Store'}],
   'references': [{'supplier': {'id': 'core'}, 'id': '1159487213'}],
   'contacts': [{'phone': [{'value': '+552422201010'},
      {'value': '+552422315720', 'categories': [{'id': '600-6000-0061'}]}]}]},
  {'title': 'Mercadinho Flor de Petrópolis',
   'id': 'here:pds:place:07675crc-6b03dfbac65a45c0bfc52ab9a3f04556',
   'ontologyId': 'here:cm:ontology:supermarket',
   'resultType': 'place',
   'address': {'label': 'Mercadinho Flor de Petrópolis, Rua Teresa, 2060, Petrópolis - RJ, 25635-530, Brazil',
    'countryCode': 'BRA',
    'countryName': 'Brazil',
    'stateCode': 'RJ',
    'state': 'Rio de Janeiro',
    'city': 'Petrópolis',
    'district': 'Petrópolis',
    'street': 'Rua Teresa',
    'postalCode': '25635-530',
    'houseNumber': '2060'},
   'position': {'lat': -22.52895, 'lng': -43.17233},
   'access': [{'lat': -22.52895, 'lng': -43.17219}],
   'distance': 574,
   'categories': [{'id': '600-6300-0066',
     'name': 'Grocery',
     'primary': True}]}]}


    value = []
    address = []
    latlong = []
    
    
    teste  =  pd.DataFrame(columns = ['nome','endereco','rua','numero',
                'cidade','estado','cep','lat','long','raio'])
    
    teste['nome'] = []    
    teste['endereco'] = [] 
    teste['rua'] = []
    teste['numero'] =[]
    teste['cidade'] = [] 
    teste['estado'] = []
    teste['cep'] = []
    teste['lat'] = []
    teste['long'] = []
    teste['raio'] = [] 
        
    
    g = pd.DataFrame.from_dict(a.values())
       
    h =[]
    
    for i in range(3):
        v = g[i].values[0]
        h = v.items()
        for k, l in  h:
                value.append(l)
        for c, d in value[4].items():
                address.append(d)
        for la, lo in value[5].items():
                latlong.append(lo)  
        novo_concorrente = {'nome': value[0], 'endereco':address[0], 
                           'rua':address[7], 'numero':address[9], 
                           'cidade':address[5], 'estado':address[3], 
                           'cep':address[8],'lat':latlong[0],
                           'long':latlong[1],'raio':value[7]}
    
        teste = teste.append(novo_concorrente, ignore_index=True)
        
    return teste

Solution

  • You should focus on your for loop. I would suggest you to create a dictionary for each row you want to define in your final DataFrame, and then create a list to append those dictionaries to.

    In example:

    rows = []
    for item in a["items"]:
        row = {
            "Latitude": item["position"]["lat"],
            "Postal code": item["address"]["postalCode"],
        }
        rows.append(row)
    
    result = DataFrame(rows)
    result
    

    Hope it helps as a starting point.