Коротко
- Сначала — векторные операции: арифметика над столбцами, методы
.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 — строки0na_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
orders["size"].map({"S": "маленький", "M": "средний", "L": "большой"})Вывод
0 маленький 1 средний 2 большой 3 средний Name: size, dtype: str
orders["price"].map(lambda p: f"{p} ₽")Вывод
0 150 ₽ 1 180 ₽ 2 210 ₽ 3 180 ₽ Name: price, dtype: str
orders[["price", "qty"]].map(lambda x: x * 10) # поэлементно по всей таблицеВывод
price qty 0 1500 20 1 1800 10 2 2100 30 3 1800 40
orders[["price", "qty"]].apply(lambda col: col.max() - col.min()) # функция получает столбецВывод
price 60 qty 3 dtype: int64
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
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. Всё, что можно записать через столбцы, пишите через столбцы.
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 удалён
orders.applymap(str)Ошибка
AttributeError: 'DataFrame' object has no attribute 'applymap'