Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Pandas eval-在列上调用用户定义的函数_Python_Pandas_Eval - Fatal编程技术网

Python Pandas eval-在列上调用用户定义的函数

Python Pandas eval-在列上调用用户定义的函数,python,pandas,eval,Python,Pandas,Eval,正如我的问题所述,我想在运行时调用自定义函数来访问数据帧。使用自定义函数将计算两个日期(即年龄)之间的差异,将年转换为月,从两列中查找最大最小值等 到目前为止,我成功地执行了算术运算和一些函数,如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)

正如我的问题所述,我想在运行时调用自定义函数来访问数据帧。使用自定义函数将计算两个日期(即年龄)之间的差异,将年转换为月,从两列中查找最大最小值等

到目前为止,我成功地执行了算术运算和一些函数,如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。如何将其用于数据帧评估

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)
感谢您提供的任何帮助或文档链接

我找到了一些有用的链接,但没有解决我的问题:


可以像往常一样调用函数,您需要使用
@
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

当然,这里的期望是函数期望序列作为参数。否则,根据需要将函数包装在对的调用中。

如果我有函数as,def max1(x,y):返回np.max(x,y)并调用df.eval(“@max1(TT,TT1)”,我得到
TypeError:“Series”对象是可变的,因此它们不能被散列。
。你知道为什么会这样吗?我想默认引擎“numexpr”无法处理它。用engine='python.@Prish解决了这个问题,我觉得这是对的。Numexpr通常速度更快,但它的使用存在局限性。您知道如何从eval调用round、ceil、floor函数吗?i、 e.
df.eval('round(A-B)')
。abs()和sqrt()工作得很好。@Prish如果您只需要对结果进行四舍五入,df.eval('A-B')不起作用吗?