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)