python pandas:将一个带有参数的函数应用于一系列

我想应用一个函数的参数在Pythonpandas系列:

x = my_series.apply(my_function, more_arguments_1) y = my_series.apply(my_function, more_arguments_2) ... 

该文档描述了对apply方法的支持,但不接受任何参数。 有不同的方法可以接受参数吗? 另外,我错过了一个简单的解决方法?

更新(2017年10月):请注意,由于这个问题最初被要求pandas apply()已被更新以处理位置和关键字参数,上面的文档链接现在反映了这一点,并显示了如何包含任一types的参数。

    文档清楚地解释了这一点。 apply方法接受一个应该有一个参数的python函数。 如果你想传递更多的参数,你应该按照Joel Cornett的build议,在他的评论中使用functools.partial

    一个例子:

     >>> import functools >>> import operator >>> add_3 = functools.partial(operator.add,3) >>> add_3(2) 5 >>> add_3(7) 10 

    您也可以使用partial来传递关键字参数。

    另一种方法是创build一个lambda:

     my_series.apply((lambda x: your_func(a,b,c,d,...,x))) 

    但我认为使用partial更好。


    请注意,较新版本的pandas允许您传递额外的参数(请参阅新文档 )。 所以,现在你可以做到:

     my_series.apply(your_function, args=(2,3,4), extra_kw=1) 

    位置参数被添加到系列的元素之后

     Series.apply(func, convert_dtype=True, args=(), **kwds) args : tuple x = my_series.apply(my_function, args = (arg1,)) 

    脚步:

    1. 创build一个数据框
    2. 创build一个函数
    3. 在apply语句中使用该函数的命名参数。

     x=pd.DataFrame([1,2,3,4]) def add(i1, i2): return i1+i2 x.apply(add,i2=9) 

    这个例子的结果是数据框中的每个数字将被添加到数字9。

      0 0 10 1 11 2 12 3 13 

    说明:

    “添加”function有两个参数:i1,i2。 第一个参数是数据框中的值,第二个参数是我们传递给“apply”函数的值。 在这种情况下,我们使用关键字参数“i2”将“9”传递给apply函数。

    您可以将任意数量的parameter passing给apply正在通过未命名参数调用的函数,作为元组传递给args参数,或者通过由kwds参数作为字典内部捕获的其他关键字参数kwds

    例如,让我们build立一个函数,返回值为3到6之间的值为True,否则返回False。

     s = pd.Series(np.random.randint(0,10, 10)) s 0 5 1 3 2 1 3 1 4 6 5 0 6 3 7 4 8 9 9 6 dtype: int64 s.apply(lambda x: x >= 3 and x <= 6) 0 True 1 True 2 False 3 False 4 True 5 False 6 True 7 True 8 False 9 True dtype: bool 

    这个匿名函数不是很灵活。 我们用两个参数创build一个正常的函数来控制我们想要的系列中的最小值和最大值。

     def between(x, low, high): return x >= low and x =< high 

    我们可以通过将未命名的parameter passing给args来复制第一个函数的输出:

     s.apply(between, args=(3,6)) 

    或者我们可以使用命名的参数

     s.apply(between, low=3, high=6) 

    甚至是两者的结合

     s.apply(between, args=(3,), high=6)