熊猫 - 与缺失值合并

aen*_*nsm 10 python merge missing-data 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]
Run Code Online (Sandbox Code Playgroud)

这与我见过的任何RDB都不同,通常缺少的值用不可知论来处理,并且不会被合并在一起,就好像它们是相同的一样.对于具有稀疏数据的数据集,这尤其成问题(每个NaN将合并到每个其他NaN,从而产生巨大的DataFrame!)

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

mel*_*oly 5

您可以在合并过程中从null 排除barfoo如果需要的话)id。但是,由于它们被切成薄片,因此不确定它是您的追求。

(我从您的左联接中假设您有兴趣保留全部foo,但只想合并该bar匹配项的一部分,并且不为null。)

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
Run Code Online (Sandbox Code Playgroud)

  • 本质上,这就是我现在作为解决方法所做的事情。我想知道是否有一个选项可以阻止熊猫似乎做出的“ NaN”匹配行为。 (2认同)
  • 啊,抱歉。我不知道,但谈到熊猫似乎总是有新的东西需要学习。:) (2认同)

小智 5

if do not need NaN in both left and right DF, use

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

else if need NaN in left DF, use

pd.merge(foo, bar.dropna(), how='left', on='id')
Run Code Online (Sandbox Code Playgroud)

  • 这是一个糟糕的答案,因为它没有概括性。dropna() 将删除任何列包含 NaN 值的所有行,这与预期行为有很大不同。您需要将其子集到合并列! (3认同)

yos*_*e_k 5

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

pd.merge(foo, bar.dropna(subset=['id']), how='outer', on='id')
Run Code Online (Sandbox Code Playgroud)

foo它基本上返回和 的并集bar

  • 这是一个糟糕的答案,因为它没有概括性。dropna() 将删除任何列包含 NaN 值的所有行,这与预期行为有很大不同。您需要将其子集到合并列, (3认同)
  • 不错的收获,已修复。 (2认同)