September 30, 2022

Скрытые достоинства 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')))