Python 传递要应用的参数

Python 传递要应用的参数,python,pandas,Python,Pandas,我试图将一个函数应用于数据帧,结果创建一个新列,如下所示: def defensive_weights(DSp=None,SGp=None,FCp=None): if dfcrop['opp_goals'] == 0: DInd = (DSp*2 + SGp + FCp) else: DInd = (DSp + SGp + FCp) return DInd dfcrop['IED'] = dfcrop['opp_goals'].a

我试图将一个函数应用于数据帧,结果创建一个新列,如下所示:

def defensive_weights(DSp=None,SGp=None,FCp=None):
    if dfcrop['opp_goals'] == 0:
        DInd = (DSp*2 + SGp + FCp)
    else:
        DInd = (DSp + SGp + FCp)

    return DInd
   
dfcrop['IED'] = dfcrop['opp_goals'].apply(defensive_weights, DSp=DSp,SGp=SGp,FCp=FCp)
我得到:

TypeError: defensive_weights() got multiple values for argument 'DSp'

我遗漏了什么?

您似乎正在从函数中调用整个数据帧系列。我想你不想这么做。应允许函数获取参数,并将其传递给条件:

def defensive_weights(item, DSp=None,SGp=None,FCp=None):
    if item == 0:
        DInd = (DSp*2 + SGp + FCp)
    else:
        DInd = (DSp + SGp + FCp)

    return DInd
让我们假设dfcrop['opp_goals']=[1,2,3,4,5]

现在,您的函数正在尝试执行以下操作:

if [1,2,3,4,5] == 0:
if 2 == 0
在这种情况下,它总是返回false

它将为每一行传递整个列,因为您是从函数中调用它的

我有一种感觉,你想让它这样做:

if [1,2,3,4,5] == 0:
if 2 == 0

因此,您需要为函数提供这些整数。要做到这一点,需要一个接一个地输入它们,这在函数中并不容易,您需要创建一个函数参数(我称之为“item”),并使用“apply”方法逐个输入它们

另外,apply语法调用整行并尝试将其传递给第一个参数。我建议使用lambda来控制哪些列转到哪些参数:

dfcrop.apply(lambda x: defensive_weights(x.opp_goals, DSp=x.DSp,SGp=x.SGp,FCp=x.FCp), axis=1)

我不知道您的数据是什么样子的,所以我假设您有几个以这些命名参数命名的列

编辑:下面是一个传递给apply方法的函数的简单示例,该示例应说明如何使用apply:

a = pd.DataFrame({'a':[1,2,3,4], 'b':[5,6,7,8]})

def modder(x,y):
    return x**y

a['c'] = a.apply(lambda x: modder(x.a, x.b), axis=1)
a

函数的第一个参数应该是传递给它的序列。因此,在您的情况下,在函数调用中添加一个参数
x
(或更好的名称),并将
dfcrop['opp\u goals']
替换为
x
。请您回答清楚一点好吗?AttributeError:(“'Series'对象没有属性'opp\u goals',发生在索引nome')我不知道你的数据是什么样子的,所以如果你能提供几行,那会很有帮助。另外,我忘记了“轴”参数。把我的答案修改了一点。