代码之家  ›  专栏  ›  技术社区  ›  Robert

熊猫系列。应用-使用其他系列的参数?

  •  1
  • Robert  · 技术社区  · 6 年前

    我有以下声明:

    >>> df['result'] = df['value'].apply(myfunc, args=(x,y,z))
    

    Python函数myfunc是在我开始使用Pandas之前编写的,它被设置为接受单个值。参数x和z是固定的,可以很容易地作为变量或文字传递,但是我的数据框中有一列表示y参数,因此我正在寻找一种方法来为每一行使用该行的值(它们在每一行中不同)。

    我的解决方法如下:

    values = list(df['value'])
    y = list(df['y'])
    df['result'] = pd.Series([myfunc(values[i],x,y[i],z) for i in range(0,len(values))])
    

    有更好的办法吗?

    编辑

    使用functools.partial有一个能够解决的问题。如果您的调用不坚持关键字参数,则它似乎会诉诸于位置,然后您可能会遇到 'myfunc()为…获取了多个值'

    我修改了coldspeed的答案:

    # Function myfunc takes named arguments arg1, arg2, arg3 and arg4
    #   The values for arg2 and arg4 don't change so I'll set them when
    #   defining the partial (assume x and z have values set)
    myfunc_p = partial(myfunc, arg2=x, arg4=z)
    df['result'] = [myfunc_p(arg1=w, arg3=y) for w, y in zip(df['value'], df['y'])]
    
    2 回复  |  直到 6 年前
        1
  •  1
  •   cs95 abhishek58g    6 年前

    我觉得你做的很好。我可能会做一些改进:

    from functools import partial
    myfunc_p = partial(myfunc, x=x, z=z)
    df['result'] = [myfunc_p(v, y) for v, y in zip(df['value'], df['y'])]
    

    你不需要用 pd.Series 调用,您可以通过修复两个参数来清除函数调用。 functools.partial .

    np.vectorize (免责声明,这实际上并没有将函数矢量化,只是隐藏了循环)对于更简洁的代码,但是在大多数情况下,列表理解应该更快。

    myfunc_v = np.vectorize(partial(myfunc, x=x, z=z))
    df['result'] = myfunc_v(df['value'], df['y'])
    
        2
  •  1
  •   rer    6 年前

    你也可以 apply 用一个 lambda

    df['result'] = df.apply(lambda row: myfunc(row['value'], y=row['y'], x=x, z=z), axis=1)