web-dev-qa-db-ja.com

pandas-欠落している値とのマージ

pandasマージ関数に癖があるようです。NaN値が等しいと見なされ、NaNsを他のNaNsとマージします。

_>>> 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になります!)

最初にそれらをスライスせずに、マージ中に欠落している値を無視する方法はありますか?

12
aensm

マージ中に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
5
meloncholy

左右両方のDFでNaNが必要ない場合は、

pd.merge(foo.dropna(), bar.dropna(), how='left', on='id')

それ以外の場合、左側のDFでNaNが必要な場合は、

pd.merge(foo, bar.dropna(), how='left', on='id')
3
Liang

両方のテーブルのNaNをスライスせずに保持する場合は、次のように外部結合メソッドを使用できます。

pd.merge(foo, bar.dropna(), how='outer', on='id')

基本的に、foobarの和集合を返します。

1
yosemite_k