Python中含NaN的列表使用sorted排序结果异常原因咨询
问题原因与解决方案
为什么会出现异常排序结果?
Python内置的sorted()函数处理包含np.nan的列表时,会因为np.nan的特殊比较逻辑出问题:np.nan和任何数值比较都会返回False。比如np.nan < -1是False,-1 < np.nan也是False,这让排序算法无法正确判断元素间的顺序,导致不同列表的排序结果看起来矛盾。
让NaN前置的解决方案
方法1:自定义sorted的key函数
通过lambda函数把np.nan映射成比所有数值都小的-np.inf,排序时NaN会自动排在最前面:
import numpy as np lst = [1,2,np.nan, -1] # 实现NaN前置的排序 sorted_lst = sorted(lst, key=lambda x: -np.inf if np.isnan(x) else x) print(sorted_lst) # 输出: [nan, -1, 1, 2]
方法2:使用numpy的排序工具
如果用numpy数组处理,可通过掩码分离NaN和非NaN元素,排序后拼接实现NaN前置:
import numpy as np arr = np.array([1,2,np.nan, -1]) # 分离NaN和非NaN部分 nan_part = arr[np.isnan(arr)] sorted_non_nan = np.sort(arr[~np.isnan(arr)]) # 拼接得到结果 result = np.concatenate([nan_part, sorted_non_nan]) print(result) # 输出: [nan -1. 1. 2.]
如果需要NaN后置,只需把key里的-np.inf换成np.inf,或者直接用numpy默认的np.sort()(默认将NaN放在末尾)。
内容的提问来源于stack exchange,提问作者figs_and_nuts
相关产品推荐
相关产品推荐

