Python 如何使用eval dataframe方法在自定义函数中返回numpy数组或列表?

Python 如何使用eval dataframe方法在自定义函数中返回numpy数组或列表?,python,python-3.x,pandas,dataframe,eval,Python,Python 3.x,Pandas,Dataframe,Eval,我正在使用Python3.X。我正在尝试使用dataframe方法,包括这样的自定义函数 将熊猫作为pd导入 将numpy作为np导入 df=pd.DataFrame({ ‘T’:[0,10,0,10,10,30], 'P':[0,0,1000,1000,0,0], 'S':[25,25,25,40,40] }) def自定义(A、B、C): #一些操作 aux=pd.DataFrame({ “A”:[0,10,0,10,10,30], }) return aux.A#这里是我想要返回numpy

我正在使用Python3.X。我正在尝试使用dataframe方法,包括这样的自定义函数

将熊猫作为pd导入
将numpy作为np导入
df=pd.DataFrame({
‘T’:[0,10,0,10,10,30],
'P':[0,0,1000,1000,0,0],
'S':[25,25,25,40,40]
})
def自定义(A、B、C):
#一些操作
aux=pd.DataFrame({
“A”:[0,10,0,10,10,30],
})
return aux.A#这里是我想要返回numpy数组或列表,或dataframe列的地方
等式='RES=T+@custom(S,T,P)+2'
df.eval(eq,engine='numexpr',inplace=True)
但我只能在函数中返回一个浮点值或整数值,一个简单的值

所以我想返回一个numpy数组或一个值列表,因为我想使用结果来处理其余的方程变量。我得到这个错误:

TypeError: unhashable type: 'numpy.ndarray'
另一个例子:

将熊猫作为pd导入
将numpy作为np导入
作为西南部进口海水
从sewater.library导入T90conv
df=pd.DataFrame({
'T':T90conv([0,10,0,10,10,30]),
'P':[0,0,1000,1000,0,0],
'S':[25,25,25,40,40]
})
cndr=sw.cndr#它返回一个numpy数组
等式='新=@cndr(S,T,P)'
df.eval(eq,engine='numexpr',inplace=True)

可能吗?我可以退哪种类型的?有没有其他方法可以实现这一点?

我无法使用
numexpr
引擎使其工作-它总是给我
TypeError:unhable类型:“numpy.ndarray”

我还尝试将
numpy.ndarray
转换为
list
tuple
——它仍然说:
TypeError:不支持的表达式类型:
TypeError:不可破坏的类型:'list'

但它确实可以与
python
引擎一起工作:

In [47]: df.eval("NEW = @sw.cndr(S, T, P)", engine='python', inplace=True)

In [48]: df
Out[48]:
      P   S          T       NEW
0     0  25   0.000000  0.498008
1     0  25   9.997601  0.654990
2  1000  25   0.000000  0.506244
3  1000  25   9.997601  0.662975
4     0  40   9.997601  1.000073
5     0  40  29.992802  1.529967
下面的解决方法是什么

In [77]: df = df.assign(RES=sw.cndr(df['S'], df['T'], df['P'])) \
                .eval("RES = T + RES + 2", inplace=False)

In [78]: df
Out[78]:
      P   S          T        RES
0     0  25   0.000000   2.498008
1     0  25   9.997601  12.652591
2  1000  25   0.000000   2.506244
3  1000  25   9.997601  12.660576
4     0  40   9.997601  12.997674
5     0  40  29.992802  33.522769

您期望/期望的数据集是什么?您不能在没有eval的情况下执行此操作吗?我希望使用函数的返回值进行操作,因为它是另一列。我已经添加了另一个@maxuYes示例,您应该像这样使用
sw.cndr(df['T'],df['P'],df['S'])
而不是使用点符号@maxu@ChesuCR,我无法使用
numexpr
使其工作。使用
engine='python'
-它工作正常…感谢您的解决方案,但我需要直接在表达式中执行。感谢您的帮助下一步是让我选择表达式中可以使用的函数,因为如果用户可以执行任何函数,它可能是一个安全漏洞