pandas – fusionando con valores perdidos

Parece que hay una peculiaridad con la función de fusión de pandas. Considera que los valores de NaN son iguales, y fusionará NaN s con otros 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 xyz 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] 

Esto es diferente a cualquier RDB que he visto, los valores que normalmente faltan se tratan con agnosticismo y no se fusionarán como si fueran iguales. Esto es especialmente problemático para los conjuntos de datos con datos dispersos (cada NaN se fusionará con todos los demás NaN, lo que dará como resultado un enorme DataFrame).

¿Hay una manera de ignorar los valores perdidos durante una fusión sin cortarlos primero?

Podrías excluir valores de la bar (y de hecho foo si quisieras) donde id es nulo durante la fusión. Sin embargo, no estoy seguro de que sea lo que buscas, ya que se cortan.

(Por su parte izquierda, asumí que está interesado en retener todo foo , pero solo desea combinar las partes de la bar que coinciden y no son nulas).

 foo.merge(bar[pd.notnull(bar.id)], how='left', on='id') Out[11]: id xyz 0 a 1 2 3 1 b 4 5 NaN 2 c 7 8 9 3 NaN 10 11 NaN 

Si no necesita NaN tanto en el DF izquierdo como en el derecho, use

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

de lo contrario, si necesita NaN en el lado izquierdo del DF,

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

Si desea conservar los NaN de ambas tablas sin cortarlos, puede usar el método de unión externa de la siguiente manera:

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

Básicamente devuelve la unión de foo y bar