Разница между методами 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 pandas
Объединение двух столбцов текста в DataFrame pandas
Импорт нескольких CSV-файлов в pandas и объединение в один DataFrame
Получить список из колонки или строки DataFrame в pandas?
Выбор строки из pandas Series/DataFrame по целочисленному индексу