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