Построить DataFrame из панда применить - PullRequest
0 голосов
/ 28 февраля 2019

У меня есть функция, которая возвращает информацию о широте и долготе.Я хочу создать столбцы для этих 4 переменных в кадре данных.

Вот мой код:

import geocoder
import pandas as pd
import geolib
from geolib import geohash

df = pd.read_csv('New_DP2.csv')

key = [redacted]


fields = ['NWLat', 'NWLong', 'SELat', 'SELong']
def getData(address, key):
    g = geocoder.mapquest(address, key=key)
    lat = g.lat
    lng = g.lng
    h = geolib.geohash.encode(lat, lng, 7)
    hashes = geolib.geohash.neighbours(h)
    NW = geohash.decode(hashes.nw)
    SE = geohash.decode(hashes.ne)
    nwlat = NW.lat
    nwlon = NW.lon
    selat = SE.lat
    selon = SE.lon

Я хочу создать четыре столбца во фрейме данных, которые будут составлять столбцы для 'nwlat', 'nwlon', 'selat', 'selon'.

Обычно я просто возвращаю nwlat и затем создаю лямбду

df['NWLong'] = df.apply(lambda row: getData(row['a'], key), axis = 1)

Затем я делаю это для каждого случая из 3 других переменных, которые я хочу вернуть.Но потом я запускаю это всего 4 раза, а не один раз.

1 Ответ

0 голосов
/ 14 мая 2019

Вы были довольно близко.Все, что вам нужно было сделать, это выяснить, как правильно вернуть результат.Ваша функция должна выглядеть следующим образом:

def getData(address, key):
    ...
    NW = geohash.decode(hashes.nw)
    SE = geohash.decode(hashes.ne)

    return pd.Series(dict(zip(fields, [NW.lat, NW.lon,  SE.lat, SE.lon]))) 

Затем вы можете использовать Series.apply:

df = pd.DataFrame({'address': ['Los Angeles, CA']})  # for example
df['address'].apply(getData, key=key)

                 NWLat                 NWLong                SELat                 SELong
0  34.0541839599609375  -118.2451629638671875  34.0541839599609375  -118.2424163818359375

Это работает, если getData вернуть объект Series (с fields в качестве индекса).apply затем автоматически построит DataFrame и вернет результат.

Примечание: для объединения этих столбцов с существующим df, вызовите pd.concat:

res = pd.concat([df, df['address'].apply(getData, key=key)], axis=1)

Другой вариант - использовать понимание списка, если в вашем DataFrame нет NaN.Это микро-оптимизация производительности (И памяти).

def getData2(address, key):
    ...
    NW = geohash.decode(hashes.nw)
    SE = geohash.decode(hashes.ne)

    return [NW.lat, NW.lon,  SE.lat, SE.lon]

pd.DataFrame([getData2(a, key) for a in df['address']], columns=fields)

                 NWLat                 NWLong                SELat                 SELong
0  34.0541839599609375  -118.2451629638671875  34.0541839599609375  -118.2424163818359375

Более подробная информация о списках и их преимуществах подробно описана в моем посте: Для циклов с пандами - Когда мне следует позаботиться?

...