python pandas:将带有参数的函数应用于一系列
- 2025-01-22 08:45:00
- admin 原创
- 87
问题描述:
我想将带有参数的函数应用于 python pandas 中的一系列:
x = my_series.apply(my_function, more_arguments_1)
y = my_series.apply(my_function, more_arguments_2)
...
文档描述了对 apply 方法的支持,但它不接受任何参数。是否有其他接受参数的方法?或者,我是否错过了一个简单的解决方法?
更新(2017 年 10 月): 请注意,由于这个问题最初被问到,所以 pandasapply()
已经更新为处理位置和关键字参数,并且上面的文档链接现在反映了这一点,并展示了如何包含任一类型的参数。
解决方案 1:
新版本的 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
更好。
解决方案 2:
步骤:
创建数据框
创建函数
在 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 函数。
解决方案 3:
Series.apply(func, convert_dtype=True, args=(), **kwds)
args : tuple
x = my_series.apply(my_function, args = (arg1,))
解决方案 4:
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)
解决方案 5:
大多数内容都在其他答案中涵盖,想重复一下您可能错过的内容,您需要在 args 元组中的参数后添加逗号,见以下示例:
df['some_column'].apply(function_name, args=(arg1 ,) #Here comma is necessary.
解决方案 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)
_ ab
0 8 9
1 9 7
2 12 7
解决方案 7:
您只需在参数后添加逗号,即可在整个列表上运行函数。示例如下。可以在集合上执行相同的过程。
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)