我想在python pandas中应用一个带参数的函数:

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

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

更新(2017年10月):请注意,由于这个问题最初被问到,pandas apply()已被更新为处理位置和关键字参数,上面的文档链接现在反映了这一点,并展示了如何包括这两种类型的参数。


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

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

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


老版本的熊猫:

文档清楚地解释了这一点。apply方法接受一个python函数,该函数应该只有一个参数。如果你想传递更多的参数,你应该使用functools。正如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更好。


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

args : tuple

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

步骤:

创建一个数据框架 创建一个函数 在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。第一个参数是数据帧中的值,第二个参数是传递给apply函数的值。在本例中,我们使用关键字参数“i2”将“9”传递给apply函数。


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

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

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

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)

#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)

_ a b 0 8 9 1 9 7 2 12 7


大多数事情都在其他答案中覆盖,想要重复一件你可能错过的事情,你需要在args元组的参数后添加一个逗号,见下面的例子:

df['some_column'].apply(function_name, args=(arg1 ,) #Here comma is necessary.

你只需要在参数后添加逗号,然后你就可以在整个列表上运行函数。示例如下。在片场也可以这么做。

df = {"name" : [2,3,4,6],
      
      "age" : [4,10, 30, 20]
      }

print("Before")
df = pd.DataFrame(df)

print(df)

def fun(a, b):
    for c in b:
        a +=c
    return a
[![enter image description here][1]][1]

listt = set([3,4,5])

print("After")
new = df.apply(fun, args = (listt,))
print(new)