Какой из них предпочтительнее? np.where или .loc?

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

  1. .loc
mask = df['param'].isnull()
df.loc[mask, 'param'] = 'new_value'
  1. нп.где ()
mask = df['param'].isnull()
df['param'] = np.where(mask, 'new_value', df['param'])


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

Обычно это не имеет значения, но np.where обычно быстрее, потому что работа с NumPy напрямую позволяет избежать некоторых накладных расходов панд. OTOH, использование loc считается пандическим способом ведения дел. Но это только мое мнение, и этот вопрос основан на мнении, поэтому я голосую за закрытие.

cs95 27.05.2019 17:07

Спасибо. Мне было интересно, есть ли ответ, основанный не на вкусах или мнениях, а на реальных причинах, но это нормально.

Haritz Laboa 27.05.2019 17:11
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
5
2
3 045
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ну, не полный тест, но вот образец. В каждом прогоне (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.

Спасибо! Да, определенно эти результаты противоречат тому, что указал @cs95.

Haritz Laboa 27.05.2019 17:27

Другие вопросы по теме