Я столкнулся со следующей проблемой:
Мне нужно назначить столбец для фрейма данных, основываясь на применении функции для каждой строки. Тем не менее, имена столбцов жестко запрограммированы, и я хотел бы создать их динамически, чтобы улучшить обслуживание кода.
Небольшой фон, что делает функция apply:
Она принимает значения вокруг определенную точку («местоположение») из другого кадра данных и сохраняет их в массиве numpy (которые впоследствии будут использоваться для взаимной корреляции, но это выходит за рамки этого вопроса).
Текущий код выглядит следующим образом:
def get_yearly_values(df,
df_2018,
df_2017,
df_2016):
return df.assign(
values_1_df_2018=df.apply(lambda d: get_value_range(d, 'location', df_2018, 'Value_1'), axis=1),
values_2_df_2018=df.apply(lambda d: get_value_range(d, 'location', df_2018, 'Value_2'), axis=1),
values_1_df_2017=df.apply(lambda d: get_value_range(d, 'location', df_2017, 'Value_1'), axis=1),
values_2_df_2017=df.apply(lambda d: get_value_range(d, 'location', df_2017, 'Value_2'), axis=1),
values_1_df_2016=df.apply(lambda d: get_value_range(d, 'location', df_2016, 'Value_1'), axis=1),
values_2_df_2016=df.apply(lambda d: get_value_range(d, 'location', df_2016, 'Value_2'), axis=1),
)
Я хотел бы сохранить один список лет (и когда будут доступны новые годовые данные, я просто добавлю новый год в список в хронологическом порядке) и динамически создавать имена столбцов.
years = [df_2018, df_2017, df_2016]
Теперь я знаю, что Pandas 'assign не работает с форматированием строк, но я хотел бы сделать что-то вроде этого:
def get_yearly_values(df,
years[0],
years[1],
years[2]):
return df.assign(
f'values_1_df_{years[0]}'=df.apply(lambda d: get_value_range(d, 'location', years[0], 'Value_1'), axis=1),
f'values_2_df_{years[0]}'=df.apply(lambda d: get_value_range(d, 'location', years[0], 'Value_2'), axis=1),
f'values_1_df_{years[1]}'=df.apply(lambda d: get_value_range(d, 'location', years[1], 'Value_1'), axis=1),
f'values_2_df_{years[1]}'=df.apply(lambda d: get_value_range(d, 'location', years[1], 'Value_2'), axis=1),
f'values_1_df_{years[2]}'=df.apply(lambda d: get_value_range(d, 'location', years[2], 'Value_1'), axis=1),
f'values_2_df_{years[2]}'=df.apply(lambda d: get_value_range(d, 'location', years[2], 'Value_2'), axis=1),
)
Как я могу сделать это работа