Abe*_*Abe 114 python apply pandas
我想在python pandas中为一个系列应用带参数的函数:
x = my_series.apply(my_function, more_arguments_1)
y = my_series.apply(my_function, more_arguments_2)
...
Run Code Online (Sandbox Code Playgroud)
该文档描述了对apply方法的支持,但它不接受任何参数.是否有接受参数的不同方法?或者,我错过了一个简单的解决方法吗?
更新(2017年10月): 请注意,由于此问题最初被要求apply()
已更新pandas 以处理位置和关键字参数,上面的文档链接现在反映了这一点并显示了如何包含任一类型的参数.
Bak*_*riu 135
文档清楚地解释了这一点.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
Run Code Online (Sandbox Code Playgroud)
您也可以使用传递关键字参数partial
.
另一种方法是创建一个lambda:
my_series.apply((lambda x: your_func(a,b,c,d,...,x)))
Run Code Online (Sandbox Code Playgroud)
但我认为使用partial
更好.
需要注意的是熊猫的新版本也允许你通过额外的参数(见新的文档).所以现在你可以这样做:
my_series.apply(your_function, args=(2,3,4), extra_kw=1)
Run Code Online (Sandbox Code Playgroud)
位置参数在系列元素之后添加.
Fis*_*ury 63
脚步:
例
x=pd.DataFrame([1,2,3,4])
def add(i1, i2):
return i1+i2
x.apply(add,i2=9)
Run Code Online (Sandbox Code Playgroud)
此示例的结果是数据框中的每个数字都将添加到数字9中.
0
0 10
1 11
2 12
3 13
Run Code Online (Sandbox Code Playgroud)
说明:
"添加"功能有两个参数:i1,i2.第一个参数将是数据框中的值,第二个参数是我们传递给"apply"函数的任何值.在这种情况下,我们使用关键字参数"i2"将"9"传递给apply函数.
小智 41
Series.apply(func, convert_dtype=True, args=(), **kwds)
args : tuple
x = my_series.apply(my_function, args = (arg1,))
Run Code Online (Sandbox Code Playgroud)
Ted*_*rou 18
您可以将任意数量的参数传递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
Run Code Online (Sandbox Code Playgroud)
这个匿名函数不是很灵活.让我们创建一个带有两个参数的普通函数来控制我们在系列中想要的最小值和最大值.
def between(x, low, high):
return x >= low and x =< high
Run Code Online (Sandbox Code Playgroud)
我们可以通过将未命名的参数传递给args
:来复制第一个函数的输出:
s.apply(between, args=(3,6))
Run Code Online (Sandbox Code Playgroud)
或者我们可以使用命名参数
s.apply(between, low=3, high=6)
Run Code Online (Sandbox Code Playgroud)
甚至两者兼而有之
s.apply(between, args=(3,), high=6)
Run Code Online (Sandbox Code Playgroud)