我正在使用Python 3.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)
但是eval()
数据帧方法不能像那样工作。您只能使用这些内置函数:
支持的数学函数是sin,cos,exp,log,expm1,log1p,sqrt,sinh,cosh,tanh,arcsin,arccos,arctan,arccosh,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
有没有办法在表达式中使用自定义函数?
注意:我知道这可能是危险的,但它在我身上
答案 0 :(得分:4)
调用局部变量或本地函数时使用@
:
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