Pandas mask / where métodos versus NumPy np.where
A menudo uso Pandasmask
ywhere
métodos para una lógica más limpia al actualizar valores en una serie condicionalmente. Sin embargo, para un código relativamente crítico para el rendimiento, noto una caída significativa en el rendimiento en relación connumpy.where
.
Aunque estoy feliz de aceptar esto para casos específicos, me interesa saber:
Do Pandasmask
/ where
os métodos @ ofrecen cualquier funcionalidad adicional,aparte d inplace
/ errors
/ try-cast
parámetros? Entiendo esos 3 parámetros, pero rara vez los uso. Por ejemplo, no tengo idea de lo que ellevel
parámetro se refiere a. ¿Hay algún contraejemplo no trivial dondemask
/ where
superanumpy.where
? Si existe un ejemplo de este tipo, podría influir en la forma en que elijo los métodos apropiados en el futuro.Para referencia, aquí hay algunos puntos de referencia en Pandas 0.19.2 / Python 3.6.0:
np.random.seed(0)
n = 10000000
df = pd.DataFrame(np.random.random(n))
assert (df[0].mask(df[0] > 0.5, 1).values == np.where(df[0] > 0.5, 1, df[0])).all()
%timeit df[0].mask(df[0] > 0.5, 1) # 145 ms per loop
%timeit np.where(df[0] > 0.5, 1, df[0]) # 113 ms per loop
La actuación parece divergirpromove para valores no escalares:
%timeit df[0].mask(df[0] > 0.5, df[0]*2) # 338 ms per loop
%timeit np.where(df[0] > 0.5, df[0]*2, df[0]) # 153 ms per loop