python - 将函数应用于数据框中的每个观察

标签 python pandas geocoding

我有一个很大的坐标 df ,我正在通过一个函数(反向地理编码器)来处理它, 如何在不迭代的情况下运行整个 df (需要很长时间)

示例 df:

    Latitude    Longitude  
0   -25.66026   28.0914    
1   -25.67923   28.10525    
2   -30.68456   19.21694    
3   -30.12345   22.34256    
4   -15.12546   17.12365 

运行完我想要的函数后(没有 for 循环...)一个 df:

     City
0    HappyPlace
1    SadPlace
2    AveragePlace
3    CoolPlace
4    BadPlace

注意:我不需要知道如何进行反向地理编码,这是一个关于将函数应用于整个 df 而不进行迭代的问题。

编辑:

使用 df.apply() 可能不起作用,因为我的代码如下所示:

for i in range(len(df)):
    results = g.reverse_geocode(df['LATITUDE'][i], df['LONGITUDE'][i])
    city.append(results.city)

最佳答案

较慢的方法迭代地理点列表并获取地理点的城市

import pandas as pd
import time
d = {'Latitude': [-25.66026,-25.67923,-30.68456,-30.12345,-15.12546,-25.66026,-25.67923,-30.68456,-30.12345,-15.12546], 'Longitude': [28.0914, 28.10525,19.21694,22.34256,17.12365,28.0914, 28.10525,19.21694,22.34256,17.12365]}   
df = pd.DataFrame(data=d)
# example method of g.reverse_geocode() -> geo_reverse
def geo_reverse(lat, long):
    time.sleep(2)
    #assuming that your reverse_geocode will take 2 second
    print(lat, long)
for i in range(len(df)):
    results = geo_reverse(df['Latitude'][i], df['Longitude'][i])

因为time.sleep(2)。上述程序至少需要 20 秒来处理所有 10 个地理点。

比上面更好的方法:

import pandas as pd
import time
d = {'Latitude': [-25.66026,-25.67923,-30.68456,-30.12345,-15.12546,-25.66026,-25.67923,-30.68456,-30.12345,-15.12546], 'Longitude': [28.0914, 28.10525,19.21694,22.34256,17.12365,28.0914, 28.10525,19.21694,22.34256,17.12365]}   
df = pd.DataFrame(data=d)

import threading
def runnable_method(f, args):
    result_info = [threading.Event(), None]
    def runit():
        result_info[1] = f(args)
        result_info[0].set()
    threading.Thread(target=runit).start()
    return result_info

def gather_results(result_infos):
    results = []
    for i in range(len(result_infos)):
        result_infos[i][0].wait()
        results.append(result_infos[i][1])
    return results

def geo_reverse(args):
    time.sleep(2)
    return "City Name of ("+str(args[0])+","+str(args[1])+")"
geo_points = []
for i in range(len(df)):
    tuple_i = (df['Latitude'][i], df['Longitude'][i])
    geo_points.append(tuple_i)

result_info = [runnable_method(geo_reverse, geo_point) for geo_point in geo_points]
cities_result = gather_results(result_info)  
print(cities_result)

请注意,geo_reverse 方法的处理时间为 2 秒,用于根据地理点获取数据。在第二个示例中,代码只需 2 秒即可处理您想要的任意数量的点。

注意:尝试这两种方法,假设您的geo_reverse将花费大约。 2秒获取数据。第一种方法将花费 20+1 秒,处理时间将随着输入数量的增加而增加,但第二种方法将具有几乎恒定的处理时间(即大约 2+1)秒,无论您要处理多少个地理点。

假设上面代码中的g.reverse_geocode()方法是geo_reverse()分别运行上面的代码(方法)并自行查看差异。

说明: 看一下上面的代码及其主要部分,即创建元组列表并理解该列表,将每个元组传递给动态创建的线程(主要部分):

#Converting df of geo points into list of tuples
geo_points = []
for i in range(len(df)):
    tuple_i = (df['Latitude'][i], df['Longitude'][i])
    geo_points.append(tuple_i)
#List comprehension with custom methods and create run-able threads
result_info = [runnable_method(geo_reverse, geo_point) for geo_point in geo_points]
#gather result from each thread.
cities_result = gather_results(result_info)  
print(cities_result)

关于python - 将函数应用于数据框中的每个观察,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55713563/

相关文章:

python - 针对 NoSQL 键值对执行上下文搜索的正确方法是什么?

python - 检查有向图中节点是否共享相互连接

android - 您如何判断 Android 设备何时具有 Geocoder 后端服务?

python - 在 Windows 上使用 cookiecutter 创建 Django 项目模板

python - Flask 路由变量改变 uriencoded 字符串

python - 如何在 Jupyter notebook (iPython) 中并排显示 2 张图像?

python - 用股票报价识别 Pandas 数据框中的价格波动/趋势

python - 将带有俄语字符的 numpy.ndarray 写入文件

geocoding - 如何转换纬度和经度?

php - 如何从反向地理编码 JSON 结果中获取格式化地址?