Pythonのlist.sorted()は、比較要素にNaN値が含まれると正しくソートできない。比較要素内にNaN値がある場合は、それらを適当な値に置き換える必要がある。
サンプルコード
import numpy as np
a1 = [1, 2, 9, 3, 2, np.nan, np.nan] # 例題 a1
a2 = [1, np.nan, 2, 9, 3, 2, np.nan] # 例題 a2
# 単純なSortの実行
ng1 = sorted(a1, key=lambda x: x)
ng2 = sorted(a2, key=lambda x: x)
# NaN値を置き換えてのSortの実行
ok1 = sorted(a1, key=lambda x: np.inf if np.isnan(x) else x)
ok2 = sorted(a2, key=lambda x: np.inf if np.isnan(x) else x)
print("NG:", ng1, ng2) # 例題 a2 を正しくソートできない
print("OK:", ok1, ok2) # 両例題とも正しくソートできる
実行結果
NG: [1, 2, 2, 3, 9, nan, nan] [1, nan, 2, 2, 3, 9, nan]
OK: [1, 2, 2, 3, 9, nan, nan] [1, 2, 2, 3, 9, nan, nan]