Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python:将带参数的函数应用于序列_Python_Pandas_Apply - Fatal编程技术网

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()已被更新以处理位置参数和关键字参数,上面的文档链接

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

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,))
  • 创建一个数据帧
  • 创建一个函数
  • 在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
    
    说明:


    “添加”功能有两个参数: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)