Какой из них предпочтительнее?np.where или .loc? - PullRequest
3 голосов
/ 27 мая 2019

Я нашел две формы замены некоторых значений фрейма данных на основе условия:

  1. .loc
mask = df['param'].isnull()
df.loc[mask, 'param'] = 'new_value'
np.where ()
mask = df['param'].isnull()
df['param'] = np.where(mask, 'new_value', df['param'])

Обе формы работают хорошо, но какая из них предпочтительнее?А что касается вопроса, когда мне следует использовать .loc , а когда np.where ?

1 Ответ

1 голос
/ 27 мая 2019

Ну, не полный тест, но вот пример.В каждом прогоне (loc, np.where) данные сбрасываются на исходное случайное число с начальным числом.

данные игрушки 1

Здесь больше np.nan, чем допустимых значений,Кроме того, столбец имеет тип с плавающей запятой.

np.random.seed(1)
df = pd.DataFrame({'param': np.random.choice((1, np.nan), 1000000, p=(0.3,0.7))})

# loc
%%timeit
mask = df['param'].isnull()
df.loc[mask, 'param'] = 'new_value'
# 46.7 ms ± 177 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

# np.where
%%timeit
mask = df['param'].isnull()
df['param'] = np.where(mask, 'new_value', df['param'])
# 86.8 ms ± 2.4 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

игрушечные данные 2:

Здесь меньше np.nan допустимых значений, а столбец имеет тип объекта:

np.random.seed(1)
df = pd.DataFrame({'param': np.random.choice(("1", np.nan), 1000000, p=(0.7,0.3))})

та же история:

df.loc[mask, 'param'] = 'new_value'
# 47.8 ms ± 350 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

df['param'] = np.where(mask, 'new_value', df['param'])
# 58.9 ms ± 1.72 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

Таким образом, вопреки комментарию @ cs95, loc, кажется, превосходит np.where.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...