我有以下代码,需要很长时间才能执行。 pandas DataFrames df
和 df_plants
非常小(小于 1Mb)。我想知道是否有任何方法可以优化这段代码:
import pandas as pd
import geopy.distance
import re
def is_inside_radius(latitude, longitude, df_plants, radius):
if (latitude != None and longitude != None):
lat = float(re.sub("[a-zA-Z]", "", str(latitude)))
lon = float(re.sub("[a-zA-Z]", "", str(longitude)))
for index, row in df_plants.iterrows():
coords_1 = (lat, lon)
coords_2 = (row["latitude"], row["longitude"])
dist = geopy.distance.distance(coords_1, coords_2).km
if dist <= radius:
return 1
return 0
df["inside"] = df.apply(lambda row: is_inside_radius(row["latitude"],row["longitude"],df_plants,10), axis=1)
我使用正则表达式来处理 df 中的纬度和经度,因为这些值包含一些应该删除的错误(字符)。
函数 is_inside_radius
验证 row[latitude]
和 row[longitude]
是否位于任意点 10 公里半径范围内在df_plants
中。
最佳答案
你能试试这个吗?
import pandas as pd
from geopy import distance
import re
def is_inside_radius(latitude, longitude, df_plants, radius):
if (latitude != None and longitude != None):
lat = float(re.sub("[a-zA-Z]", "", str(latitude)))
lon = float(re.sub("[a-zA-Z]", "", str(longitude)))
coords_1 = (lat, lon)
for row in df_plants.itertuples():
coords_2 = (row["latitude"], row["longitude"])
if distance.distance(coords_1, coords_2).km <= radius:
return 1
return 0
df["inside"] = df.map(
lambda row: is_inside_radius(
row["latitude"],
row["longitude"],
df_plants,
10),
axis=1)
来自https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.iterrows.html#pandas-dataframe-iterrows ,pandas.DataFrame.itertuples()
返回值的命名元组,通常比pandas.DataFrame.iterrows()
更快,并在返回的行之间保留数据类型。
关于python - 如何检查一个点是否在给定半径内?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52807071/