pandasマージ関数に癖があるようです。NaN
値が等しいと見なされ、NaN
sを他のNaN
sとマージします。
_>>> foo = DataFrame([
['a',1,2],
['b',4,5],
['c',7,8],
[np.NaN,10,11]
], columns=['id','x','y'])
>>> bar = DataFrame([
['a',3],
['c',9],
[np.NaN,12]
], columns=['id','z'])
>>> pd.merge(foo, bar, how='left', on='id')
Out[428]:
id x y z
0 a 1 2 3
1 b 4 5 NaN
2 c 7 8 9
3 NaN 10 11 12
[4 rows x 4 columns]
_
これは私が見たどのRDBとも異なり、通常、欠落している値は不可知論で扱われ、等しいかのようにマージされません。これは、データがまばらなデータセットでは特に問題になります(すべてのNaNが他のすべてのNaNにマージされ、巨大なDataFrameになります!)
最初にそれらをスライスせずに、マージ中に欠落している値を無視する方法はありますか?
マージ中にbar
がnullの場合、foo
(および必要に応じて実際にはid
)から値を除外できます。しかし、それらは切り取られているので、それがあなたが求めているものかどうかはわかりません。
(左結合から、foo
のすべてを保持することに関心があると想定しましたが、一致し、nullではないbar
の部分のみをマージしたいと思います。)
foo.merge(bar[pd.notnull(bar.id)], how='left', on='id')
Out[11]:
id x y z
0 a 1 2 3
1 b 4 5 NaN
2 c 7 8 9
3 NaN 10 11 NaN
左右両方のDFでNaNが必要ない場合は、
pd.merge(foo.dropna(), bar.dropna(), how='left', on='id')
それ以外の場合、左側のDFでNaNが必要な場合は、
pd.merge(foo, bar.dropna(), how='left', on='id')
両方のテーブルのNaNをスライスせずに保持する場合は、次のように外部結合メソッドを使用できます。
pd.merge(foo, bar.dropna(), how='outer', on='id')
基本的に、foo
とbar
の和集合を返します。