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!)
有没有办法在合并期间忽略缺失值而不先将它们切片出来?
答案 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')
它基本上返回foo
和bar