Как динамически назначать имена столбцов с Pandas? - PullRequest
1 голос
/ 21 февраля 2020

Я столкнулся со следующей проблемой:

Мне нужно назначить столбец для фрейма данных, основываясь на применении функции для каждой строки. Тем не менее, имена столбцов жестко запрограммированы, и я хотел бы создать их динамически, чтобы улучшить обслуживание кода.

Небольшой фон, что делает функция 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),
    )

Как я могу сделать это работа

...