209

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

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

文档描述了对 apply 方法的支持,但它不接受任何参数。是否有不同的方法可以接受参数?或者,我是否缺少一个简单的解决方法?

更新(2017 年 10 月): 请注意,由于最初提出此问题,pandasapply()已更新为处理位置和关键字参数,上面的文档链接现在反映了这一点,并显示了如何包含任何一种类型的参数。

4

6 回答 6

228

较新版本的 pandas确实允许您传递额外的参数(请参阅新文档)。所以现在你可以这样做:

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

位置参数添加系列元素之后。


对于旧版本的熊猫:

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

一个例子:

>>> 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更好。

于 2012-08-29T17:36:10.973 回答
109

脚步:

  1. 创建数据框
  2. 创建一个函数
  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

解释:

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

于 2017-04-17T22:15:26.613 回答
49
Series.apply(func, convert_dtype=True, args=(), **kwds)

args : tuple

x = my_series.apply(my_function, args = (arg1,))
于 2014-11-13T21:12:58.800 回答
31

您可以将任意数量的参数传递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)
于 2017-11-04T02:58:09.777 回答
2
#sample dataframe

import pandas as pd

df1=pd.DataFrame({'a':[3,4,7],'b':[4,2,2]})

#my function

def add_some(p,q,r):return p+q+r

df2=df1[["a","b"]].apply(add_some, args=(3,2))

print(df2)

_ ab

0 8 9

1 9 7

2 12 7

于 2021-03-02T08:30:23.810 回答
1

大多数内容都包含在其他答案中,想要重复您可能错过的内容,您需要在 args 元组中的参数后添加逗号,请参见以下示例:

df['some_column'].apply(function_name, args=(arg1 ,) #Here comma is necessary.
于 2021-11-12T08:07:33.773 回答