

PythonのPandasで、2つのデータフレームraw1, raw2があり、raw1のx1,x2とraw2のy1,y2を比べて違うもの(x1!=y1 or
x2!=y2)のみを出力したいと考えていますが、片方は欠損値がnan, もう一方はNoneになっており、比較ができなくて困っています。

`raw1 = raw1.where((pd.notnull(raw1)), None)`  
として、nanをNoneに寄せることはできるのですが、

[code]

    out = pd.merge(raw1, raw2, on='key')
    out = out[(out.x1 is not out.y1)]
    
[/code]

としてもエラーは出ないものの、x1,y1ともにNoneのものが残ってしまい困っています。

また、最後に  
`out = out[(out.x1 is not out.y1) or (out.x2 is not out.y2)]`  
として違うもののみを出力するところもうまくいきません。  
以下のエラーが出ます。  
`ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(),
a.item(), a.any() or a.all().`

詳しい方、教えていただけないでしょうか。  
よろしくお願いいたします。

**追記**

[code]

    import pandas as pd
    
    x = pd.DataFrame({'col_0': ["zero", "one", None],
                        'col_1': np.arange(3, 6),
                        'col_2': ("6", "7", None)},
                       index=['row_0', 'row_1', 'row_2'])
    out = x[(x.col_0 is not x.col_2)]
    
[/code]

とすると、  
`KeyError: True`  
となり、  
`out = x[(x.col_0 != x.col_2)]`  
はエラーは起きませんが、outとxが全く同じになってしまう（＝全くフィルターが掛かっていない）ということになります。

**そもそもNaNをNoneに寄せるというのが正しいのか気になります。**  
**NoneをNaNに寄せるのはNaNを含む列が数値じゃないと成り立たないので、やはりNaNをNoneに寄せるほうが正しい、ということでよいのでしょうか。それともNoneとNaNのまま比べられる方法もあるのでしょうか？**

**実行環境**  
Windows 10  
Python 3.7


CC BY-SA 4.0
2020-08-23T04:33:09.200
69787
2020-09-01T15:14:58.647
2020-09-01T14:19:48.143
12457
12457
question
python pandas
データフレームのnanとNoneの比較


[こちらの回答](https://stackoverflow.com/a/53344904) が参考になります。

[code]

    import pandas as pd
    import numpy as np
    from operator import is_not
    
    x = pd.DataFrame({'col_0': ["zero", "one", None],
                      'col_1': np.arange(3, 6),
                      'col_2': ("6", "7", None)},
                      index=['row_0', 'row_1', 'row_2'])
    print(x)
    
    out = x.iloc[np.where(np.vectorize(is_not)(x.col_0, x.col_2))]
    print(out)
    
[/code]

**出力結果**

[code]

          col_0  col_1 col_2
    row_0  zero      3     6
    row_1   one      4     7
    row_2  None      5  None
    
          col_0  col_1 col_2
    row_0  zero      3     6
    row_1   one      4     7
    
[/code]

**追記**

>
> そもそもNaNをNoneに寄せるというのが正しいのか気になります。NoneをNaNに寄せるのはNaNを含む列が数値じゃないと成り立たないので、やはりNaNをNoneに寄せるほうが正しい、ということでよいのでしょうか。それともNoneとNaNのまま比べられる方法もあるのでしょうか？

比較処理を関数化する方法が考えられます。

[code]

    import pandas as pd
    import numpy as np
    
    x = pd.DataFrame({'col_0': ['zero', 'one', np.nan],
                      'col_1': np.arange(3, 6),
                      'col_2': ('6', '7', None)},
                      index=['row_0', 'row_1', 'row_2'])
    print(x)
    
    def f(a, b):
      return (
        False if all(x in (None, np.nan) for x in (a, b))
        else (a != b))
    
    out = x.iloc[np.where(np.vectorize(f)(x.col_0, x.col_2))]
    print(out)
    
    =>
          col_0  col_1 col_2
    row_0  zero      3     6
    row_1   one      4     7
    row_2   NaN      5  None
    
          col_0  col_1 col_2
    row_0  zero      3     6
    row_1   one      4     7
    
[/code]


CC BY-SA 4.0
2020-09-01T13:38:37.623
70054
2020-09-01T15:14:58.647
2020-09-01T15:14:58.647
69787
answer