互いにnp.nanを含む2つの集合をunionした際にnp.nanが2つ残存する現象


概要

  • この記事は解決策ではなく現象のメモです
    • 理由や解決策をご存知の方は教えてください
  • 互いにnp.nanを含む2つの集合(setA, setB)をunionした
    • setC = setA.union(setB)
    • 期待:結果の和集合にはnp.nanは(当然)1つ含まれる
    • 結果:結果の和集合にはnp.nanが(なぜか)2つ含まれていた
  • 何故にwhy? # 未解決
    • 原因を探ってみた
      • 和集合に含まれる2つのnp.nanはidが異なる
        • np.nanA, np.nanBとする
        • 通常のnp.nanのidとも異なる
      • np.isnanとmath.isnanでは共にTrue
      • np.nanA is np.nan, np.nanB is np.nanはFalse
        • 通常はnp.nan is np.nan はTrueのハズ
    • np.nanA, np.nanBの生成過程で別インスタンスになっている?
      • なお、元集合は異なるpandas dfの列から生成している
        • setA = set(dfA['colname'].unique().tolist())
        • setB = set(dfB['colname'].unique().tolist())
  • 暫定対処
    • 元集合の生成時にnp.isnanを噛ませた
      • ar_A = dfA['colname'].unique()
      • setA = set(ar_A[~np.isnan(ar_A)])
    • np.nanは処理が全て終わってから要素として追加(どうせ含まれてるので)
  • 環境
    • python 3.8.8
    • pandas 1.2.4
    • numpy 1.20.1