DataFrame.assign() — добавление колонок без изменения оригинала

assign() возвращает новый DataFrame с добавленными или пересчитанными колонками, не трогая исходный. Колонки задаются именованными аргументами: df.assign(profit=df['revenue'] - df['cost']). Значением может быть готовый Series, скаляр или функция/lambda, которая получает весь DataFrame — это удобно в цепочках .pipe()/.query(). Ключевое отличие от df['x'] = ... в том, что assign() не мутирует объект.

Синтаксис

df.assign(col1=…, col2=lambda d: …, …)

Примеры использования

Пример 1: Новая колонка из арифметики

df.assign(net=df['amount'] * 0.87)

Результат:

   order_id channel  amount      net
0      1001   email     450   391.50
1      1002     ads    1200  1044.00

Пример 2: Вторая колонка ссылается на первую

df.assign(
    net=lambda d: d['amount'] * 0.87,
    net_k=lambda d: d['net'] / 1000
)

Результат:

   order_id  amount      net  net_k
0      1001     450   391.50  0.392
1      1002    1200  1044.00  1.044

Пример 3: Булев флаг через lambda

df.assign(is_big=lambda d: d['amount'] >= 1000)

Результат:

   order_id  amount  is_big
0      1001     450   False
1      1002    1200    True
Порешать Python-задачи в тренажёре →

Типичная ошибка

assign() всегда возвращает копию — на больших DataFrame в цикле это дорого, лучше собрать все колонки за один вызов. Внутри одного assign() сослаться на только что созданную колонку можно только через lambda и только если она объявлена раньше (порядок kwargs сохраняется с Python 3.7). Если имя колонки не валидный идентификатор, передавай через словарь: df.assign(**{'gross amount': ...}).

Где спрашивают на собеседовании

На собесе просят переписать df['x']=... в иммутабельном стиле для method chaining — assign() и есть ответ. Идёт в паре с .pipe(), .query() и lambda; часто всплывает в вопросах про чистый функциональный pipeline.

FAQ: частые вопросы про assign

Чем assign() отличается от df['new'] = ...?

df['new']=... меняет DataFrame на месте и ничего не возвращает, а assign() возвращает новую копию и не трогает оригинал. Поэтому assign() удобен в цепочках методов. За счёт копии он чуть дороже по памяти.

Можно ли в одном assign() сослаться на колонку, созданную в этом же вызове?

Да, если использовать lambda и колонка объявлена раньше по порядку аргументов. Порядок kwargs гарантирован начиная с Python 3.7. Прямая ссылка d['net'] на ещё не существующую колонку упадёт с KeyError.

Как создать колонку с пробелом в имени через assign()?

Обычные kwargs требуют валидный идентификатор, поэтому используй распаковку словаря: df.assign(**{'gross amount': df['amount']}). Так можно задать любое строковое имя. Читать такую колонку потом удобнее через df['gross amount'].

Задачи в тренажёре по теме

Вопросы с собеседований по теме

Смежные темы Python

Pandas: основы

Другие функции pandas

groupby · merge · pivot_table · apply · value_counts · drop_duplicates

Открыть Python-тренажёр (556 задач) →