Я часто использую mask
Pandas и where
методы для более чистой логики при обновлении значений в серии условно. Однако для относительно критически важного кода я замечаю значительное падение производительности по сравнению с numpy.where
.
Хотя я рад принять это в конкретных случаях, мне интересно узнать:
-
mask
Pandas/where
методы предлагают какие-либо дополнительные функции, помимо параметровinplace
/errors
/try-cast
? Я понимаю эти 3 параметра, но редко их использую. Например, я понятия не имею, к чему относится параметрlevel
. - Есть ли нетривиальный встречный пример, где
mask
/where
превосходитnumpy.where
? Если такой пример существует, это может повлиять на то, как я выбираю подходящие методы, идущие вперед.
Для справки, здесь некоторый бенчмаркинг по 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
Похоже, что производительность отличается от нескалярных значений:
%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