Python在Pandas DataFrame中迭代,并添加使用geopy.geocoders计算的新值,以推荐性能

Python在Pandas DataFrame中迭代,并添加使用geopy.geocoders计算的新值,以推荐性能,python,pandas,performance,dictionary,geopy,Python,Pandas,Performance,Dictionary,Geopy,我有一个包含数百万行的.csv文件。行包含有关位置(街道名称)的数据,我正在尝试将该街道名称转换为经度和纬度,因为我正在尝试进行一些地理分析。问题是处理一行大约需要0.5秒 我尝试用动态编程改进代码,并将已计算的值保存在字典中,以便重用它们,但这只会将计算单行所需的时间提高到0.3秒左右 街道名称确实重复了很多次,当我排在第1000行时,我从字典中得到了大约50%的点击率,不幸的是,这似乎仍然太慢了。如果有人知道我如何改进这段代码,我会洗耳恭听,因为当前代码或多或少是无用的,因为遍历所有行需要一

我有一个包含数百万行的.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来提高稳定性。看见