df.assign(net=df['amount'] * 0.87)
Результат:
order_id channel amount net 0 1001 email 450 391.50 1 1002 ads 1200 1044.00
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
df.assign(is_big=lambda d: d['amount'] >= 1000)
Результат:
order_id amount is_big 0 1001 450 False 1 1002 1200 TrueПорешать Python-задачи в тренажёре →
На собесе просят переписать df['x']=... в иммутабельном стиле для method chaining — assign() и есть ответ. Идёт в паре с .pipe(), .query() и lambda; часто всплывает в вопросах про чистый функциональный pipeline.
df['new']=... меняет DataFrame на месте и ничего не возвращает, а assign() возвращает новую копию и не трогает оригинал. Поэтому assign() удобен в цепочках методов. За счёт копии он чуть дороже по памяти.
Да, если использовать lambda и колонка объявлена раньше по порядку аргументов. Порядок kwargs гарантирован начиная с Python 3.7. Прямая ссылка d['net'] на ещё не существующую колонку упадёт с KeyError.
Обычные kwargs требуют валидный идентификатор, поэтому используй распаковку словаря: df.assign(**{'gross amount': df['amount']}). Так можно задать любое строковое имя. Читать такую колонку потом удобнее через df['gross amount'].
groupby · merge · pivot_table · apply · value_counts · drop_duplicates
Открыть Python-тренажёр (556 задач) →