我如何使用 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)

applyaxis=1 为每一行调用您的函数,但有 1 个参数:该行作为 Series 对象。因此,您要么需要修改函数定义以采用单行而不是多个参数,要么将函数调用包装在 lambda 函数中,该函数从每一行中提取值并使用它们调用函数。

  1. 修改函数以获取单行
    而不是这个:

    def delta(S, K, t, r, sigma):
        # ... 
    

    这样做:

    def delta(row):
        S, K, t, r, sigma = row.tolist()
        # ...
    
  2. 将函数调用包装在 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=])