Python

Python list.sorted() における NaN値の扱い

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]