我如何使用 df 的多列作为函数的输入?
how do i use multiple columns of a df as input to a function?
我有一个充满数值的数据框。我想应用一个需要 6 个参数的函数 (delta)。
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 的变体,但我一直收到错误。我认为是因为它试图将函数应用于每个单独的值,而不是行。
我可以用其他方式做到这一点吗? (没有 iterrows,它太慢了,它是一个有 500k 行的 df)
apply
和 axis=1
为每一行调用您的函数,但有 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
中的项目“分散”到 [= 的单独参数中18=])
我有一个充满数值的数据框。我想应用一个需要 6 个参数的函数 (delta)。
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 的变体,但我一直收到错误。我认为是因为它试图将函数应用于每个单独的值,而不是行。
我可以用其他方式做到这一点吗? (没有 iterrows,它太慢了,它是一个有 500k 行的 df)
apply
和 axis=1
为每一行调用您的函数,但有 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
中的项目“分散”到 [= 的单独参数中18=])