python pandas

python - Añadiendo dos series con NaNs



axis title plotly r (3)

Estoy trabajando en "Python para análisis de datos" y no entiendo una funcionalidad en particular. Agregar dos objetos de la serie pandas alineará automáticamente los datos indexados, pero si un objeto no contiene ese índice, se devuelve como NaN. Por ejemplo del libro:

a = Series([35000,71000,16000,5000],index=[''Ohio'',''Texas'',''Oregon'',''Utah'']) b = Series([NaN,71000,16000,35000],index=[''California'', ''Texas'', ''Oregon'', ''Ohio''])

Resultado:

In [63]: a Out[63]: Ohio 35000 Texas 71000 Oregon 16000 Utah 5000 In [64]: b Out[64]: California NaN Texas 71000 Oregon 16000 Ohio 35000

Cuando los agrego juntos obtengo esto ...

In [65]: a+b Out[65]: California NaN Ohio 70000 Oregon 32000 Texas 142000 Utah NaN

Entonces, ¿por qué el valor de Utah es NaN y no 500? Parece que 500 + NaN = 500. ¿Lo que da? Me estoy perdiendo algo, por favor explique.

Actualizar:

In [92]: # fill NaN with zero b = b.fillna(0) b Out[92]: California 0 Texas 71000 Oregon 16000 Ohio 35000 In [93]: a Out[93]: Ohio 35000 Texas 71000 Oregon 16000 Utah 5000 In [94]: # a is still good a+b Out[94]: California NaN Ohio 70000 Oregon 32000 Texas 142000 Utah NaN


El enfoque predeterminado es asumir que cualquier cálculo que involucre NaN da como resultado NaN. Cualquier cosa más NaN es NaN, cualquier cosa dividida por NaN es NaN, etc. Si desea llenar el NaN con algún valor, debe hacerlo explícitamente (como lo mostró Dan Allan en su respuesta).


Pandas no asume que 500 + NaN = 500, pero es fácil pedirle que haga eso: a.add(b, fill_value=0)


Tiene más sentido usar pd.concat() ya que puede aceptar más columnas.

import pandas as pd import numpy as np a = pd.Series([35000,71000,16000,5000],index=[''Ohio'',''Texas'',''Oregon'',''Utah'']) b = pd.Series([np.nan,71000,16000,35000],index=[''California'', ''Texas'', ''Oregon'', ''Ohio'']) pd.concat((a,b), axis=1).sum(1, min_count=1)

Salida:

California NaN Ohio 70000.0 Oregon 32000.0 Texas 142000.0 Utah 5000.0 dtype: float64

O con 3 series:

import pandas as pd import numpy as np a = pd.Series([1, np.NaN, 4, 5]) b = pd.Series([3, np.NaN, 5, np.NaN]) c = pd.Series([np.NaN,np.NaN,np.NaN,np.NaN]) print(pd.concat((a,b,c), axis=1).sum(1, min_count=1)) #0 4.0 #1 NaN #2 9.0 #3 5.0 #dtype: float64