我有一个充满数值的数据帧。我想应用一个函数(delta)它有6个参数
calls['delta'] = calls[['callput','underlyinglast','strike','yte','rfr','hvol90']].apply(delta,axis=1)
我一直得到错误
TypeError: delta() missing 5 required positional arguments: 'S', 'K', 't', 'r', and 'sigma'
我也尝试了lambda的变体,但我一直得到错误。我想是因为它试图将函数应用于每个单独的值,而不是行。
我可以用其他方法吗?(没有迭代,它很慢,它的df有500k行)
apply
withaxis=1
为每一行调用您的函数,但有一个参数:行作为Series
对象。因此,你要么需要修改你的函数定义,接受单行而不是多个参数,要么将你的函数调用包装在一个lambda函数中,该函数从每行提取值并使用它们调用函数。
-
修改你的函数取单行
代替:def delta(S, K, t, r, sigma): # ...
这样做:
def delta(row): S, K, t, r, sigma = row.tolist() # ...
-
在lambda函数中封装函数调用
代替:calls['delta'] = calls[['callput','underlyinglast','strike','yte','rfr','hvol90']].apply(delta,axis=1)
这样做:
calls['delta'] = calls[['callput','underlyinglast','strike','yte','rfr','hvol90']].apply(lambda row: delta(*row), axis=1)
(这里的技巧是使用
lambda row: delta(*row)
而不仅仅是delta
;*row
基本上"传播";row
中的项跨delta
的单独参数