Вы были довольно близко.Все, что вам нужно было сделать, это выяснить, как правильно вернуть результат.Ваша функция должна выглядеть следующим образом:
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
Более подробная информация о списках и их преимуществах подробно описана в моем посте: Для циклов с пандами - Когда мне следует позаботиться?