#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), но я этого не понял, теперь он просто щелкнул, и я понимаю, почему это работает и как его применять!