pandas - python Pandas:将带有参数的函数应用到序列

我想将带有参数的函数应用到python Pandas中:


x = my_series.apply(my_function, more_arguments_1)


y = my_series.apply(my_function, more_arguments_2)


...



有没有其他接受参数的方法? 或者,我是否缺少一个简单的解决方法?

时间:

文档清楚地解释了这一点,apply方法接受一个单个参数的python函数。

一个示例:


>>> import functools


>>> import operator


>>> add_3 = functools.partial(operator.add,3)


>>> add_3(2)


5


>>> add_3(7)


10



你还可以使用partial传递关键字参数。

另一种方法是创建一个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)



步骤:

  • 创建dataframe
  • 创建函数
  • 使用应用语句中函数的命名参数。

示例


x=pd.DataFrame([1,2,3,4]) 



def add(i1, i2): 


 return i1+i2



x.apply(add,i2=9)



这个示例的结果是,dataframe中的每个数字都将添加到数字9中,


 0


0 10


1 11


2 12


3 13



解释:

"add"函数有两个参数: i1,i2.第一个参数将是数据帧中的值,第二个参数是我们传递给“ apply ”函数的值。在这里,关键参数"i2"将"9"传递给apply函数。


Series.apply(func, convert_dtype=True, args=(), **kwds)



args : tuple



x = my_series.apply(my_function, args = (arg1,))



可以通过apply调用的参数传递任意数量的参数,作为元组传递给args参数,或者通过kwds参数。

例如,让我们构建一个函数,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



这个匿名函数不是很灵活,让我们创建一个带有两个参数的普通函数来控制我们的序列中的最小值和最大值。


def between(x, low, high):


 return x >= low and x =< high



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


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



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


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



或者是两者的组合


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



...