Присваивание df["new"] = ..., assign, insert; выражения на существующих колонках векторизуются; избегайте цикла по iterrows для расчёта колонки.
Разбор
assign удобен в method chaining (возвращает новый df).
- Правая часть выравнивается по index.
- Условная колонка:
np.where / mask / clip.
- Не используйте
apply(axis=1) без нужды.
Пример
df = df.assign(total=lambda x: x["price"] * x["qty"])
Итог
Новые колонки считайте векторно и через assign в цепочках.