применить пользовательскую функцию, передать kwarg, где значения существуют в нескольких столбцах

#python #pandas

#python #pandas

Вопрос:

Пожалуйста, простите меня, если на это был дан ответ, я не смог найти ничего, что вполне соответствовало бы моим потребностям.

У меня есть фрейм данных со смесью полей с плавающей запятой и строк. Это выглядит примерно так —

 data = {'df_to_look_at':['A','B'], 'data_to_use':[100,200]}
  

У меня есть функция, которая использует первый столбец для выбора фрейма данных, а второй столбец — для поиска возвращаемого значения. Я хочу создать новый столбец с возвращаемым значением.

Моя функция выглядит примерно так —

 def find_value(col_a, col_b):
    
    #set lookup table based on argument
    if col_a == 'A':
        table = table_a
    elif col_a == 'B':
        table = table_b

    #Find the value based on column b, set it to the adj variable, and return the adj variable
    adj = table.loc[(table['Term']==B), 'Adj'].values
  

Строка, которую я хочу запустить, чтобы создать новые столбцы, выглядит примерно так

 df['new_val'] = df.apply(find_value, col_a = df['df_to_look_at'], col_b = df['data_to_use'])

  

В моем реальном коде у меня есть около 5 аргументов в моей функции, один используется для установки фрейма данных для просмотра, остальные являются критериями для поиска значения, необходимого для нового столбца. До сих пор я узнал, как передавать kwargs в функцию apply, но только в виде абсолютных значений, таких как 3 или ‘A’, а не «значение в этой строке в столбце X»

Первый заданный вопрос, надеюсь, я понял суть

Спасибо за вашу помощь!

Ответ №1:

Я бы выбрал несколько иной подход. Apply отправляет столбцы или строки в определенную вами функцию. Итак, следующее было бы другим способом решения вашей проблемы (и, вероятно, более быстрым способом).

 def find_value(row):

    #set lookup table based on argument
    if row['df_to_look_at'] == 'A':
        table = table_a
    elif row['data_to_use'] == 'B':
        table = table_b

    adj = table.loc[(table['Term']==B), 'Adj'].values


#apply across rows
df.apply(find_value, axis = 1)
  

Комментарии:

1. Спасибо за это, я видел это решение раньше (передавая целую серию в качестве аргумента и используя axis = 1), но я этого не понял, теперь он просто щелкнул, и я понимаю, почему это работает и как его применять!