Скрытые достоинства assign, которыми почти никто не пользуется
Расскажу об областях применения оператора assign, которые приходят в голову только с опытом. Обычно аналитики не находят смысла в его использовании , так как обычным назначением является создание колонки, а это же можно сделать более привычным способом:
import pandas as pd df = pd.DataFrame({'id':[1,2], 'value':[3,4]}) df
df.assign(mon='2022-10')
При этом намного популярнее делать это же так:
df['mon'] = '2022-10' df
Однако оператор assign предоставляет следующие неочевидные преимущества:
Внесение в датафрейм внешней информации
Допустим вы хотите объединить два файла из директории и из названия извлечь месяц отчетности. Рассмотрим, как это можно сделать компактно с оператором assign. Вот наши файлы:
import os fn_l = ['data/assign/'+fn for fn in os.listdir('data/assign') if '.csv' in fn] fn_l
их можно прочитать и объединить в одну строку:
pd.concat([pd.read_csv(fn) for fn in fn_l])
а так занести информацию сразу в итоговый датафрейм:
df = pd.concat([pd.read_csv(fn).assign(mon=fn[-11:-4]) for fn in fn_l]) df
Без оператора assign то же потребовалось бы делать отдельным шагом.
Assign для lambda функции
Допустим теперь, что вы используете компактную lambda функцию и хотите добавить колонку к датафрейму. Многих бы это вынудило писать отдельную функцию, однако assign в этой ситуации может как раз оказаться очень кстати. Например, добавим колонки квадрата value и преобразованного к типу даты столбца mon:
df.groupby('id').apply(lambda x: x.assign(value_2 = x['value']**2, dt=pd.to_datetime(x['mon'], format='%Y-%m')))