es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Pandas .apply función y asignar valor indexado del retorno de la función.

Tengo un pandas DataFrame con algunas direcciones que estoy tratando de geocodificar. La función de geocodificación devuelve una lista de Lat, Long. Me gustaría asignar la Lat y Long a columnas separadas en el Pandas DataFrame.

Aquí está el código.

import geocoder
token = MAPBOX_KEY

def obtener_geocodigos(direccion):

    g = geocoder.mapbox(direccion, key=token)
    geojson = g.json
    direccion = geojson["address"]

    coordenadas = [geojson['lat'], geojson['lng']]

    Lat = coordenadas[0]
    Long = coordenadas[1]

    return (Lat, Long)

# DataFrame
df = pd.DataFrame({'ID': [1,2,3],
               'Addr': ['320 E Willeta Phoenix AZ 85004',
                        '6811 East Main Street Scottsdale AZ 85251',
                        '20446-20456 Saticoy Street Los Angeles CA 91306'],
               'Lat': [1,1,1],
               'Long': [1,1,1]
              })


# Aplicar latitud y longitud al Pandas DataFrame

df['Lat'] = df.apply(lambda x : obtener_geocodigos(x['Addr']), axis=1)
df['Long'] = df.apply(lambda x : obtener_geocodigos(x['Addr']), axis=1)

¿Cómo puedo acceder a los valores de la lista y asignarlos a las columnas Lat y Long del Pandas DataFrame? Preferiría no modificar la función ya que se utiliza en varios lugares.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para acceder a los valores de la lista devuelta por la función de geocodificación get_geocodes() y asignarlos a las columnas Lat y Long en el Pandas DataFrame por separado, podemos utilizar el método .apply() y una función lambda para desempaquetar la tupla devuelta.

    Aquí está el código modificado:

    import geocoder
    
    token = MAPBOX_KEY
    
    def get_geocodes(dirección):
        g = geocoder.mapbox(dirección, key=token)
        geojson = g.json
        coords = [geojson['lat'], geojson['lng']]
        return tuple(coords)
    
    # DataFrame
    df = pd.DataFrame({'ID': [1,2,3],
                       'Addr': ['320 E Willeta Phoenix AZ 85004',
                                '6811 East Main Street Scottsdale AZ 85251',
                                '20446-20456 Saticoy Street Los Angeles CA 91306'],
                       'Lat': [1,1,1],
                       'Long': [1,1,1]
                      })
    
    # Aplicar latitud y longitud al Pandas DataFrame
    df[['Lat', 'Long']] = df['Addr'].apply(lambda x: pd.Series(get_geocodes(x)))
    
    

    Utilizando el método .apply() en la columna df['Addr'] con la función lambda lambda x: pd.Series(get_geocodes(x)) se aplica la función get_geocodes() a cada elemento de la columna df['Addr'] y se devuelve una tupla. La función pd.Series() luego desempaqueta la tupla y asigna los valores devueltos a las columnas Lat y Long respectivamente. Usando dobles corchetes [['Lat', 'Long']] se asignan los valores a ambas columnas a la vez.

Comments are closed.