Pandas eval - вызвать пользовательскую функцию по столбцам - PullRequest
1 голос
/ 10 марта 2020

Как говорится в моем вопросе, я бы хотел вызывать пользовательскую функцию во время выполнения для кадра данных. Использование пользовательской функции будет заключаться в том, чтобы рассчитать разницу между двумя датами (то есть возрастом), преобразовать год в месяцы, найти максимальное значение из двух столбцов и т. Д. c.

Пока что мне удалось выполнить арифметические c операции и несколько функций, таких как abs (), sqrt (), но я не смог заставить работать min () - max (). Работает,

df.eval('TT = sqrt(Q1)',inplace=True)
df.eval('TT1 = abs(Q1-Q2)',inplace=True)
df.eval('TT2 = (Q1+Q2)*Q3',inplace=True)

Следующий код работает с eval. Как я могу использовать то же самое с DataFrame Eval?

def find_max(x,y):
    return np.maximum(x,y)

eval('max1')(4,7)

def find_age(date_col1,date_col2):
    return 'I know how to calc age but how to call func this with df.eval and assign to new col'

Пример кадра данных:

op_d = {'ID': [1, 2,3],'V':['F','G','H'],'AAA':[0,1,1],'D':['2019/12/04','2019/02/01','2019/01/01'],'DD':['2019-12-01','2016-05-31','2015-02-15'],'CurrentRate':[7.5,2,2],'NoteRate':[2,3,3],'BBB':[0,4,4],'Q1':[2,8,10],'Q2':[3,5,7],'Q3':[5,6,8]}
df = pd.DataFrame(data=op_d)

Любая помощь или ссылка на Do c приветствуется.

полезные ссылки, которые я нашел, но не решал свои проблемы:

Dynami c Оценка выражения в pandas с использованием pd.eval ()

Использование локальных переменных с несколькими присваиваниями с pandas функцией eval

Передача аргументов в python eval ()

1 Ответ

1 голос
/ 10 марта 2020

Функции можно вызывать как обычно, вам нужно ссылаться на них с помощью @ synbol:

df                                                                  
   A  B
0  1  0
1  0  0
2  0  1

def my_func(x, y): return x + y                                     

df.eval('@my_func(A, B)')                                          
0    1
1    0
2    1
dtype: int64

Конечно, здесь ожидается, что ваши функции ожидают ряды в качестве аргументов. В противном случае, оберните вашу функцию в вызове к np.vectorize, в зависимости от ситуации.

...