如何使用eval数据框方法在表达式中使用自定义函数?

Che*_*uCR 2 python eval dataframe python-3.x pandas

我正在使用Python3.X。

使用内置函数,eval()您可以使用对象的字典,以便使用这样的自定义函数:

from math import *

def one():
    # some operations
    return 1

functions = {
    '__builtins__': None,
    'sqrt': sqrt,
    'one': one,
}
variables = {
    '__builtins__': None,
    'pi': pi,
}
expression = 'sqrt(34 * pi) + one()'
eval(expression, variables, functions)
Run Code Online (Sandbox Code Playgroud)

但是eval()dataframe方法不能那样工作。您只能使用以下内置函数:

支持的数学函数为sin,cos,exp,log,expm1,log1p,sqrt,sinh,cosh,tanh,arcsin,arccos,arctan,arcosh,arcsinh,arctanh,abs和arctan2

import pandas as pd
import numpy as np
from math import *

df = pd.DataFrame({
    'A': [0, 10, 0, 10, 10, 30],
    'B': [0, 0, 1000, 1000, 0, 0],
    'C': [25, 25, 25, 25, 40, 40]
})

def custom():
    # some operations
    return 3

functions = {
    'custom': custom
}
variables = {
    'pi': pi
}
equation = 'D = sqrt(A) + B + custom()'
df.eval(
    equation, global_dict=variables, local_dict=functions,
    engine='numexpr', inplace=True
)
# ERROR: "custom" is not a supported function
Run Code Online (Sandbox Code Playgroud)

有没有办法在表达式中使用自定义函数?

注意:我知道它可能会危害生命,但这是在我身上

Max*_*axU 6

使用@调用本地变量或局部功能时:

In [45]: equation = 'D = sqrt(A) + B + @custom()'
#  NOTE:   ------------>               ^

In [46]: df.eval(equation, inplace=True)

In [47]: df
Out[47]:
    A     B   C            D
0   0     0  25     3.000000
1  10     0  25     6.162278
2   0  1000  25  1003.000000
3  10  1000  25  1006.162278
4  10     0  40     6.162278
5  30     0  40     8.477226
Run Code Online (Sandbox Code Playgroud)