Python在Pandas DataFrame中迭代,并添加使用geopy.geocoders计算的新值,以推荐性能
我有一个包含数百万行的.csv文件。行包含有关位置(街道名称)的数据,我正在尝试将该街道名称转换为经度和纬度,因为我正在尝试进行一些地理分析。问题是处理一行大约需要0.5秒 我尝试用动态编程改进代码,并将已计算的值保存在字典中,以便重用它们,但这只会将计算单行所需的时间提高到0.3秒左右 街道名称确实重复了很多次,当我排在第1000行时,我从字典中得到了大约50%的点击率,不幸的是,这似乎仍然太慢了。如果有人知道我如何改进这段代码,我会洗耳恭听,因为当前代码或多或少是无用的,因为遍历所有行需要一周的时间 我当前的代码如下所示:Python在Pandas DataFrame中迭代,并添加使用geopy.geocoders计算的新值,以推荐性能,python,pandas,performance,dictionary,geopy,Python,Pandas,Performance,Dictionary,Geopy,我有一个包含数百万行的.csv文件。行包含有关位置(街道名称)的数据,我正在尝试将该街道名称转换为经度和纬度,因为我正在尝试进行一些地理分析。问题是处理一行大约需要0.5秒 我尝试用动态编程改进代码,并将已计算的值保存在字典中,以便重用它们,但这只会将计算单行所需的时间提高到0.3秒左右 街道名称确实重复了很多次,当我排在第1000行时,我从字典中得到了大约50%的点击率,不幸的是,这似乎仍然太慢了。如果有人知道我如何改进这段代码,我会洗耳恭听,因为当前代码或多或少是无用的,因为遍历所有行需要一
def long_lat_to_csv(数据集,输出文件):
数据集[“经度”]=无
数据集['latitude']=无
地理定位器=提名(用户\代理=“测试”)
longlat=dict()
地区=“美国纽约市”
对于i,dataset.ItErrors()中的行:
如果int(i)%100==0:
打印('当前行:',i)
地址=行[“街道名称”]
尝试:
#如果地址已计算:
long,lat=longlat[地址]
dataset.at[i,'经度']=长
dataset.at[i,'纬度']=lat
除:
#如果地址还没有计算出来
尝试:
loc=地理定位器。地理编码(地址+','+区域)
longlat[地址]=[位置经度,位置纬度]
除:
#还存储不返回的地址
longlat[地址]=无
dataset.to_csv(输出_文件,索引=False)
使用iterrows
在数据帧上迭代是一种方便的方法,但性能非常差
在这里,你应该:
merge
将这些坐标复制回原始数据帧geolocator = Nominatim(user_agent="test")
area = "New York City, USA"
addresses = dataset['Street Name'].drop_duplicates()
addresses = pd.concat(addresses,
pd.DataFrame([loc.longitude, loc.latitude] for address in addresses
for loc in [geolocator.geocode(address + ',' + area)]],
index=addresses.index, columns=['longitude', 'latitude']))
dataset = dataset.merge(addresses, on=['Street Name'])
dataset.to_csv(output_file, index=False)
考虑使用RealEdter来提高稳定性。看见