Нашли ошибку?
среднийpandas 3.0.6

Функции: map, apply, pipe

Применить свою функцию к значениям, столбцам или строкам — и понять, почему сначала стоит искать векторную операцию.

Нужно знать:Столбцы: добавить, изменить, удалить

Содержание статьи

Коротко

  • Сначала — векторные операции: арифметика над столбцами, методы .str, .dt, np.where. Они в десятки и сотни раз быстрее.
  • Series.map(словарь или функция) — преобразовать каждое значение.
  • DataFrame.map(функция) — к каждой ячейке таблицы (раньше назывался applymap).
  • df.apply(f) передаёт в функцию столбцы, df.apply(f, axis=1) — строки. Построчный apply — это цикл Python.
  • df.pipe(f, …) — вызвать функцию от всей таблицы внутри цепочки методов.

Синтаксис

s.map(dict_or_func, na_action=None)
df.map(func)                       # поэлементно
df.apply(func, axis=0)             # func(столбец)
df.apply(func, axis=1)             # func(строка) — медленно
df.pipe(func, *args, **kwargs)     # func(df, ...)

Параметры

ПараметрЧто делаетПо умолчанию
arg / funcсловарь, Series или функцияобязательный
axisв apply: 0 — функция получает столбцы, 1 — строки0
na_actionв map: "ignore" — не вызывать функцию для NaNNone

Примеры

Данные для примеровиспользуются во всех примерах ниже
import timeit

orders = pd.DataFrame({
    "size": ["S", "M", "L", "M"],
    "price": [150, 180, 210, 180],
    "qty": [2, 1, 3, 4],
})
Сначала — операция над столбцами
orders["price"] * orders["qty"]                   # сначала — операции над столбцами
Вывод
0    300
1    180
2    630
3    720
dtype: int64
map со словарём
orders["size"].map({"S": "маленький", "M": "средний", "L": "большой"})
Вывод
0    маленький
1      средний
2      большой
3      средний
Name: size, dtype: str
map с функцией
orders["price"].map(lambda p: f"{p} ₽")
Вывод
0    150 ₽
1    180 ₽
2    210 ₽
3    180 ₽
Name: price, dtype: str
DataFrame.map — каждая ячейка
orders[["price", "qty"]].map(lambda x: x * 10)    # поэлементно по всей таблице
Вывод
   price  qty
0   1500   20
1   1800   10
2   2100   30
3   1800   40
apply по столбцам
orders[["price", "qty"]].apply(lambda col: col.max() - col.min())   # функция получает столбец
Вывод
price    60
qty       3
dtype: int64
apply по строкам
def label(row):
    return f"{row['size']}×{row['qty']}"

orders.apply(label, axis=1)                       # функция получает строку
Вывод
0    S×2
1    M×1
2    L×3
3    M×4
dtype: str
pipe в цепочке
def add_total(df):
    return df.assign(total=df["price"] * df["qty"])

def only_big(df, limit):
    return df[df["total"] > limit]

orders.pipe(add_total).pipe(only_big, limit=400)
Вывод
  size  price  qty  total
2    L    210    3    630
3    M    180    4    720

Подводные камни

apply по строкам медленный

Для каждой строки создаётся Series и вызывается функция Python. Всё, что можно записать через столбцы, пишите через столбцы.

apply(axis=1) против векторной операции
big = pd.concat([orders] * 5000, ignore_index=True)       # 20 000 строк
t_apply = min(timeit.repeat(lambda: big.apply(lambda r: r["price"] * r["qty"], axis=1), number=1, repeat=3))
t_vector = min(timeit.repeat(lambda: big["price"] * big["qty"], number=1, repeat=3))
print(f"apply: {t_apply * 1000:.1f} мс, столбцы: {t_vector * 1000:.2f} мс")
print(f"ускорение: ×{t_apply / t_vector:.0f}")           # apply по строкам — цикл Python
Выводзамер на Apple M4 · macOS · Python 3.14, 29.09.2026
apply: 33.3 мс, столбцы: 0.04 мс
ускорение: ×811

applymap удалён

Вызов applymapошибка: AttributeError
orders.applymap(str)
Ошибка
AttributeError: 'DataFrame' object has no attribute 'applymap'