Коротко
df["new"] = выражениедобавляет или заменяет столбец на месте. Одно значение запишется во все строки.df.assign(new=...)возвращает новую таблицу и удобно встраивается в цепочки. Внутриassignможно ссылаться на только что созданные столбцы черезlambda d: …илиpd.col("…").insert(позиция, имя, значения)— добавить столбец в нужное место.rename(columns={"старое": "новое"})иdrop(columns=[...])возвращают новую таблицу.pd.col("price")(новое в pandas 3.0) — короткая ссылка на столбец вместоlambda d: d["price"].
Синтаксис
df["new"] = df["a"] * 2
df.assign(new=lambda d: d["a"] * 2, other=pd.col("b") + 1)
df.insert(loc, column, value)
df.rename(columns={"old": "new"})
df.drop(columns=["a", "b"], errors="raise")Параметры
ПараметрЧто делаетПо умолчанию
columnsв rename — словарь или функция для имён; в drop — список удаляемых столбцовNoneerrorsв drop: "ignore" — не падать, если столбца нет"raise"locв insert: позиция нового столбцаобязательныйПримеры
menu = pd.DataFrame({
"item": ["латте", "чай", "раф"],
"price": [180, 90, 220],
"cost": [60, 15, 80],
})menu["margin"] = menu["price"] - menu["cost"] # новый столбец из вычисления
menu["currency"] = "RUB" # одно значение на все строки
menuВывод
item price cost margin currency 0 латте 180 60 120 RUB 1 чай 90 15 75 RUB 2 раф 220 80 140 RUB
menu.assign(
margin=lambda d: d["price"] - d["cost"],
margin_pct=lambda d: (d["margin"] / d["price"] * 100).round(1),
)Вывод
item price cost margin margin_pct 0 латте 180 60 120 66.7 1 чай 90 15 75 83.3 2 раф 220 80 140 63.6
menu.assign(price_usd=pd.col("price") / 90) # pd.col — ссылка на столбец (pandas 3.0)Вывод
item price cost price_usd 0 латте 180 60 2.000000 1 чай 90 15 1.000000 2 раф 220 80 2.444444
menu.insert(1, "size", ["M", "L", "M"]) # вставить на позицию 1
menuВывод
item size price cost 0 латте M 180 60 1 чай L 90 15 2 раф M 220 80
menu.rename(columns={"item": "позиция", "price": "цена"})Вывод
позиция цена cost 0 латте 180 60 1 чай 90 15 2 раф 220 80
menu.drop(columns=["cost"])Вывод
item price 0 латте 180 1 чай 90 2 раф 220
menu["price"] = (menu["price"] * 1.1).round() # заменить значения столбца
menuВывод
item price cost 0 латте 198.0 60 1 чай 99.0 15 2 раф 242.0 80
Подводные камни
rename, drop и assign не меняют исходную таблицу
Они возвращают новую таблицу — результат нужно сохранить: menu = menu.drop(columns=["cost"]). Таблицу на месте меняют присваивание (df["col"] = …, df.loc[…] = …), insert, pop и del df["col"].
Удаление несуществующего столбца
menu.drop(columns=["discount"])Ошибка
KeyError: "['discount'] not found in axis"
Если столбца может не быть — errors="ignore".