DataFrame使用sort_values按列1排序结果异常,列2、4排序正常问题
问题:DataFrame按列1排序结果异常,其他列正常
我有一个DataFrame,按列2、列4排序时结果符合预期,但按列1排序却得到错误结果。相关代码及输出如下:
pd.DataFrame(np.hstack([np.array(labels).reshape([-1,1]),picked_box_probs[:,:4]])) Out[59]: 0 1 2 3 4 0 皖 5.7159505 11.721471 31.53594 59.627377 1 2 174.8078 10.9442625 201.33795 62.615562 2 6 147.1714 10.0783825 173.1844 61.20856 3 8 93.03298 11.160529 117.985115 60.283916 4 A 33.483356 11.9336815 58.625034 59.587143 5 N 65.282814 11.349585 90.84942 59.98239 6 X 120.351524 11.449275 145.36586 61.187523 pd.DataFrame(np.hstack([np.array(labels).reshape([-1,1]),picked_box_probs[:,:4]])).sort_values(1) Out[60]: 0 1 2 3 4 6 X 120.351524 11.449275 145.36586 61.187523 2 6 147.1714 10.0783825 173.1844 61.20856 1 2 174.8078 10.9442625 201.33795 62.615562 4 A 33.483356 11.9336815 58.625034 59.587143 0 皖 5.7159505 11.721471 31.53594 59.627377 5 N 65.282814 11.349585 90.84942 59.98239 3 8 93.03298 11.160529 117.985115 60.283916
原因分析
核心问题是数据类型不匹配:
用np.hstack拼接字符串数组(labels)和数值数组(picked_box_probs)后,NumPy会把整个数组统一转为字符串类型。列1的数值看起来是数字,实际存储的是字符串,而字符串排序是按字符ASCII码顺序进行的——比如"120..."会排在"33..."前面,因为字符'1'的ASCII码比'3'小,这就导致了数值排序的错误结果。
解决方法
方法1:创建DataFrame时直接指定列类型
df = pd.DataFrame( np.hstack([np.array(labels).reshape([-1,1]), picked_box_probs[:,:4]]), dtype={0: str, 1: float, 2: float, 3: float, 4: float} ) df.sort_values(1) # 此时按数值排序,结果正常
方法2:创建后转换列类型
df = pd.DataFrame(np.hstack([np.array(labels).reshape([-1,1]), picked_box_probs[:,:4]])) # 将列1到列4转为浮点型 df[[1,2,3,4]] = df[[1,2,3,4]].astype(float) df.sort_values(1)
方法3:分开传入数据,避免类型统一
不用np.hstack,直接按列传入不同类型的数据:
df = pd.DataFrame({ 0: labels, 1: picked_box_probs[:, 0], 2: picked_box_probs[:, 1], 3: picked_box_probs[:, 2], 4: picked_box_probs[:, 3] }) df.sort_values(1)
内容的提问来源于stack exchange,提问作者user1495110
相关产品推荐
相关产品推荐

