python:将带参数的函数应用于序列
我想将带有参数的函数应用于python中的一个系列:python:将带参数的函数应用于序列,python,pandas,apply,Python,Pandas,Apply,我想将带有参数的函数应用于python中的一个系列: x = my_series.apply(my_function, more_arguments_1) y = my_series.apply(my_function, more_arguments_2) ... 描述了对apply方法的支持,但它不接受任何参数。是否有接受参数的不同方法?或者,我是否缺少一个简单的解决方法 更新(2017年10月):注意,由于这个问题最初是问熊猫apply()已被更新以处理位置参数和关键字参数,上面的文档链接
x = my_series.apply(my_function, more_arguments_1)
y = my_series.apply(my_function, more_arguments_2)
...
描述了对apply方法的支持,但它不接受任何参数。是否有接受参数的不同方法?或者,我是否缺少一个简单的解决方法
更新(2017年10月):注意,由于这个问题最初是问熊猫apply()
已被更新以处理位置参数和关键字参数,上面的文档链接现在反映了这一点,并显示了如何包含这两种类型的参数。熊猫的较新版本确实允许您传递额外的参数(请参阅)。现在你可以做:
my_series.apply(your_function, args=(2,3,4), extra_kw=1)
位置参数添加在序列的元素之后
对于较旧版本的熊猫: 文档对此进行了清楚的解释。apply方法接受一个python函数,该函数应该只有一个参数。如果要传递更多参数,应使用Joel Cornett在其评论中建议的
functools.partial
例如:
>>> 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)))
但是我认为使用部分代码更好。步骤:
Series.apply(func, convert_dtype=True, args=(), **kwds)
args : tuple
x = my_series.apply(my_function, args = (arg1,))
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
说明:
“添加”功能有两个参数: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
或者我们可以使用命名参数
s.apply(between, low=3, high=6)
或者两者兼而有之
s.apply(between, args=(3,), high=6)
_a b
089
197
2127
为什么不直接使用
functools.partial
或starmap
?有关DataFrame应用方法接受args
参数的信息,请参阅和,该参数是一个元组,包含其他位置参数或**kwd(用于命名参数)。我创建了一个问题,使Series.apply()功能也得到了实现,将在即将发布的pandas版本中。这是一个很好的答案,但它的前2/3现在已经过时了。在我看来,这个答案可以很好地更新,只需作为新文档的链接,再加上一个如何与position和/或关键字args一起使用的简短示例。只是FWIW,而不是对原始答案的批评,只会从IMO的更新中受益,特别是因为它是一个经常阅读的答案。@watsonic文档已经更新,单击旧链接可以找到当前文档,现在可以很好地回答问题。注:如果您传递的是单个字符串参数,例如'abc'
,那么args=('abc')
将作为三个参数('a','b','c')
进行计算。为了避免这种情况,您必须传递一个包含字符串的元组,并且要做到这一点,必须包含一个尾随逗号:args=('abc',)
谢谢!你能解释为什么args=(arg1,)在第一个参数后需要一个逗号吗?@MishaTeplitskiy,你需要这个逗号,以便Python理解括号的内容是长度为1的元组。为func
添加args怎么样。因此,如果我想应用pd.Series.mean(axis=1)
如何输入axis=1
?作为旁注,您也可以添加一个关键字参数而不使用参数(例如:x=my_Series.apply(my_函数,keyword_arg=arg1),其中是my_函数的输入参数之一)这个回答太短,不能准确地解释我在寻找什么。值得注意的是,这并不需要创建一个自定义函数来处理一个系列(或df)。完美的剩下的唯一问题是:如何将关键字参数传递给add(i1)中的第一个参数并使用i2进行迭代?我认为这是最好的回答@Connor的注释,当必须指定第一个位置参数时,如何处理两个位置参数?
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)