【发布时间】:2021-12-22 13:30:16
【问题描述】:
我有一个带有纬度和经度集(约 32m 条记录)的 Dask DataFrame。我正在尝试使用如下函数计算纬度/经度之间的距离:
import numpy as np
from geopy import distance
def calc_distance(df, lat_col_name_1, lon_col_name_1, lat_col_name_2, lon_col_name_2):
if df[lat_col_name_1] != np.nan and df[lon_col_name_1] != np.nan and df[lat_col_name_2] != np.nan and df[lon_col_name_2] != np.nan:
return distance.distance((df[lat_col_name_1], df[lon_col_name_1]), (df[lat_col_name_2], df[lon_col_name_2])).miles
else:
return np.nan
我尝试使用 map_partitions 调用此函数(以创建索引和距离的 DataFrame 以及使用 assign 调用 map_paritions。我想使用 assign 以避免将 DataFrame 重新连接在一起(似乎很昂贵)。它确实不像 np.nan 检查。我得到了一个
ValueError:Series 的真值不明确。使用 a.empty, a.bool()、a.item()、a.any() 或 a.all()。
我有零纬度/经度的记录,所以我需要在计算距离时考虑到这一点。
使用 map_partitions
distance = big_df.map_partitions(calc_distance,
lat_col_name_1='latitude_1',
lon_col_name_1='longitude_1',
lat_col_name_2='latitude_2',
lon_col_name_2='longitude_2',
meta={'distance': np.float64})
使用 map_partitions 和分配
def calc_distance_miles(lat1, lon1, lat2, lon2):
if lat1 != np.nan and lon1 != np.nan and lat2 != np.nan and lon2 != np.nan:
return distance.distance((lat1, lon1), (lat2, lon2)).miles
else:
return np.nan
big_df = big_df.map_partitions(lambda df: df.assign(
distance=calc_distance_miles(df['latitude_1'], df['longitude_1'], df['latitude_2'], df['longitude_2'])
), meta={'distance': np.float64}
)
【问题讨论】:
-
小心使用
np.nan的布尔运算符。 NaN 从不等于任何东西。请注意,np.nan != np.nan的计算结果为True。所以你的测试没有做任何事情。相反,在 DataFrame 和 Series 上使用pd.isnull()或isnull方法。见the pandas docs on working with missing data
标签: python dataframe dask dask-distributed dask-dataframe