熊猫 - 与缺失值合并

时间:2014-05-29 18:17:02

标签: python merge pandas missing-data

pandas合并功能似乎有一个怪癖。它会将NaN值视为相等,并将NaN与其他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!)

有没有办法在合并期间忽略缺失值而不先将它们切片出来?

3 个答案:

答案 0 :(得分:3)

如果您愿意,可以从bar(实际上是foo)中排除值,其中id在合并期间为空。但是,不确定它是什么,因为它们被切掉了。

(我从您的左侧加入中假设您有兴趣保留所有foo,但只想合并匹配且不为空的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

答案 1 :(得分:3)

如果左右DF都不需要NaN,请使用

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

否则如果在左DF中需要NaN,请使用

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

答案 2 :(得分:1)

如果您想要保留两个表中的NaN而不将它们切片,您可以使用外连接方法,如下所示:

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

它基本上返回foobar

的联合