如何筛选Pandas DataFrame中经纬度在-90至90范围内的数据?
解决方案
1. 先清洗数据,筛选有效经纬度行
在调用distance函数前,先过滤出所有经纬度数值都在[-90, 90]范围内的行:
# 定义筛选条件:四个经纬度列的数值都处于-90到90之间 valid_mask = ( (df_n['pickup_latitude'].between(-90, 90)) & (df_n['pickup_longitude'].between(-90, 90)) & (df_n['dropoff_latitude'].between(-90, 90)) & (df_n['dropoff_longitude'].between(-90, 90)) ) # 提取符合要求的有效数据 df_valid = df_n[valid_mask].copy()
2. 调用函数处理有效数据
对清洗后的df_valid调用distance函数计算距离:
# 计算有效数据的行驶距离 distance_travelled = distance(df_valid) # 将计算结果添加到有效数据框中 df_valid['distance'] = distance_travelled
3. (可选)保留原数据结构并填充结果
如果需要保留原数据的完整结构,可将有效行的距离结果匹配回去,无效行的distance设为缺失值:
# 初始化原数据框的distance列为缺失值 df_n['distance'] = pd.NA # 将有效数据的距离赋值回原数据框对应行 df_n.loc[valid_mask, 'distance'] = distance_travelled
4. 优化原distance函数(可选)
原函数使用iterrows遍历行效率较低,建议改用apply提升性能:
from geopy.distance import vincenty def distance(df): return df.apply( lambda row: vincenty( (row['pickup_latitude'], row['pickup_longitude']), (row['dropoff_latitude'], row['dropoff_longitude']) ).mi, axis=1 )
调用优化后的函数时,直接赋值即可:
df_valid['distance'] = distance(df_valid)
内容的提问来源于stack exchange,提问作者Robbie Case
相关产品推荐
相关产品推荐

