嵌套循环实现Haversine距离计算并生成成员地点远近排名DataFrame
原代码的核心问题有两个:
- 循环内覆盖了存储临时结果的
df、df_2变量,没有保留每个成员的计算结果 - 冗余的索引重置、单行列DataFrame创建操作容易引发索引对齐错误
修正后的可运行代码如下:
import pandas as pd # 此处默认你已经正确实现了haversine距离计算函数 # 初始化总结果存储列表 final_result = [] for m in range(len(members)): # 取出当前成员的基础信息 curr_member = members.iloc[m] member_id = curr_member["member_id"] mem_lon = curr_member["longitude"] mem_lat = curr_member["latitude"] # 计算当前成员到所有地点的距离 loc_dist_list = [] for s in range(len(locations)): curr_loc = locations.iloc[s] dist = haversine( lon1 = mem_lon, lat1 = mem_lat, lon2 = curr_loc["Longitude"], lat2 = curr_loc["Latitude"] ) loc_dist_list.append({ "location_name": curr_loc["location_name"], "distance": dist }) # 距离排序 sorted_dist = pd.DataFrame(loc_dist_list).sort_values( by = "distance", ascending = True, na_position = "first" ).reset_index(drop = True) # 拼接单成员结果加入总列表 final_result.append({ "member_id": member_id, "location_1": sorted_dist.loc[0, "location_name"], "distance_1": sorted_dist.loc[0, "distance"], "location_2": sorted_dist.loc[1, "location_name"], "distance_2": sorted_dist.loc[1, "distance"], "location_3": sorted_dist.loc[2, "location_name"], "distance_3": sorted_dist.loc[2, "distance"] }) # 生成最终总表 final_df = pd.DataFrame(final_result)
如果后续数据量变大,可以用笛卡尔积(cross join)批量计算所有成员和地点的距离,替代嵌套循环提升运行效率,当前3个成员3个地点的场景下上述代码性能足够。
内容的提问来源于stack exchange,提问作者June Smith
相关产品推荐
相关产品推荐

