aen*_*nsm 10 python merge missing-data pandas
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]
Run Code Online (Sandbox Code Playgroud)
这与我见过的任何RDB都不同,通常缺少的值用不可知论来处理,并且不会被合并在一起,就好像它们是相同的一样.对于具有稀疏数据的数据集,这尤其成问题(每个NaN将合并到每个其他NaN,从而产生巨大的DataFrame!)
有没有办法在合并期间忽略缺失值而不先将它们切片出来?
您可以在合并过程中从null 排除bar
(foo
如果需要的话)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)
小智 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)
如果您想保留两个表中的 NaN 而不将它们切掉,您可以使用外连接方法,如下所示:
pd.merge(foo, bar.dropna(subset=['id']), how='outer', on='id')
Run Code Online (Sandbox Code Playgroud)
foo
它基本上返回和 的并集bar