Разница между методами map, applymap и apply в Pandas
Можете ли вы объяснить, когда использовать эти методы векторизации с простыми примерами?
Я вижу, что map — это метод Series, тогда как остальные методы относятся к DataFrame. Я запутался в отношении методов apply и applymap. Почему у нас есть два метода для применения функции к DataFrame? Буду признателен за простые примеры, которые прояснят их назначение!
4 ответ(ов)
@jeremiahbuddha правильно указал, что метод apply применяет функцию к строкам или столбцам DataFrame, в то время как applymap применяется к каждому элементу. Однако, как вы заметили, использование apply для элемент-wise вычислений также возможно, хотя это может не быть его основным назначением.
В приведенном вами примере frame.apply(np.sqrt) и frame.applymap(np.sqrt) дают одинаковые результаты, потому что функция np.sqrt может быть применена и к целым столбцам, и к отдельным элементам. Однако следует помнить, что при использовании apply на DataFrame, в зависимости от параметров, функция может быть применена по строкам или по столбцам, что может привести к различиям в поведении, особенно когда функция не является элемент-wise.
Таким образом, в общем случае для элемент-wise вычислений предпочтительнее использовать applymap, так как он явно предназначен для этой задачи и работает быстрее для DataFrame. Но иногда применение apply может привести к нужному результату, как в вашем случае с np.sqrt.
Самое простое объяснение разницы между apply и applymap:
apply принимает всю колонку в качестве параметра и затем присваивает результат этой колонке.
applymap, в свою очередь, принимает отдельное значение ячейки как параметр и присваивает результат обратно в эту ячейку.
Обратите внимание, что если apply возвращает единственное значение, вы получите это значение вместо колонки после присвоения, и в конечном итоге у вас будет лишь строка вместо матрицы.
Хотел бы обратить внимание на один момент, с которым я немного повозился.
Если у вас есть функция:
def f(x):
if x < 0:
x = 0
elif x > 100000:
x = 100000
return x
И вы применяете её на датафрейме с помощью applymap:
df.applymap(f)
df.describe()
Имейте в виду, что это не изменяет сам датафрейм. Вам нужно переопределить его, чтобы изменения вступили в силу:
df = df.applymap(f)
df.describe()
Таким образом, в последнем случае df будет содержать обновлённые значения.
Мое понимание:
С точки зрения функции:
Если функция должна сравнивать переменные в колонках или строках, используйте apply.
Например: lambda x: x.max() - x.mean().
Если функция должна применяться к каждому элементу:
Если нужно работать с колонкой или строкой, используйте
apply.Если необходимо применить к всему DataFrame, используйте
applymap.
Пример:
majority = lambda x: x > 17
df2['legal_drinker'] = df2['age'].apply(majority)
def times10(x):
if isinstance(x, int):
x *= 10
return x
df2.applymap(times10)
Такой подход помогает выбирать правильный метод в зависимости от того, как вы хотите обрабатывать данные.
Как изменить порядок столбцов в DataFrame?
Преобразование списка словарей в DataFrame pandas
Объединение двух столбцов текста в DataFrame pandas
Установить значение для конкретной ячейки в DataFrame pandas с использованием индекса
Выбор строки из pandas Series/DataFrame по целочисленному индексу