Pandas DataFrame按dist列排序失效问题求助
问题根源:
dist列是object类型导致排序逻辑错误 你遇到的排序失效问题,核心原因就是**dist列被识别成了object(字符串)类型**,这时候sort_values会按照字符串的字典序来排序,而不是我们期望的数值大小排序,自然得不到正确的结果。
为什么dist列会变成object类型?
看你代码里这一行:
RESULTS = pd.DataFrame(np.array(lresults))
当你把lresults(一个包含字符串和数值的混合列表)转换成np.array时,NumPy为了兼容所有元素类型,会把整个数组的类型统一设为object。之后转成Pandas DataFrame时,dist列就继承了这个object类型,不再是数值类型了。
解决方案
这里有两种直接有效的修复方式:
方式1:直接用列表创建DataFrame(推荐)
跳过np.array转换这一步,直接把lresults传给pd.DataFrame,Pandas会自动识别各列的正确类型:
def closest_locations(from_loc_point, to_loc_list): lresults=list() for list_index in range(len(to_loc_list)): dist= hypot(locations[from_loc_point[0]][0] -locations[to_loc_list[list_index]][0],locations[from_loc_point[0]][1] -locations[to_loc_list[list_index]][1]) lista_dist = [from_loc_point[0],to_loc_list[list_index],dist] lresults.append(lista_dist[:]) # 直接用列表创建DataFrame,无需转np.array RESULTS = pd.DataFrame(lresults, columns=['from','to','dist']) RESULTS.sort_values(['dist'], ascending=[True], inplace=True) RESULTS.index = range(len(RESULTS)) return RESULTS
方式2:手动转换dist列的类型
如果不想修改DataFrame的创建逻辑,可以在排序前把dist列转成数值类型:
# 在sort_values之前添加这一行 RESULTS['dist'] = RESULTS['dist'].astype(float) RESULTS.sort_values(['dist'], ascending=[True], inplace=True)
验证修复效果
修复后,你可以用RESULTS.dtypes查看列类型,dist应该显示为float64。这时候再排序,就会按照数值从小到大排列,E和F(它们的距离应该是最小的)就会排在前面了。
另外,小建议:你可以用enumerate简化循环里的索引处理,让代码更简洁:
for loc in to_loc_list: dist= hypot(locations[from_loc_point[0]][0] - locations[loc][0], locations[from_loc_point[0]][1] - locations[loc][1]) lresults.append([from_loc_point[0], loc, dist])
内容的提问来源于stack exchange,提问作者Florian
相关产品推荐
相关产品推荐

