我有一个返回纬度和经度信息的函数。我想在数据框中为这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然后创建一个lambda
df['NWLong'] = df.apply(lambda row: getData(row['a'], key), axis = 1)
然后我将针对要返回的其他3个变量的每种情况进行此操作。但是,我总共运行了4次,而不是一次。
答案 0 :(得分:4)
您距离很近。您需要做的只是弄清楚如何适当地返回结果。您的函数将需要如下所示:
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
通过让fields
返回Series对象(以apply
作为索引)来工作。 df
随后将自动构造一个DataFrame并返回结果。
旁注:要将这些列连接到现有的pd.concat
,请调用res = pd.concat([df, df['address'].apply(getData, key=key)], axis=1)
:
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
如果您的DataFrame中没有NaN,则另一个选择是使用列表推导。这是性能(AND内存)的微优化。
{{1}}
有关列表理解及其益处的更多信息,已在我的帖子中详细介绍:For loops with pandas - When should I care?