带lambda和不带lambda的pandas apply()函数

9
当使用pandas的apply()函数时,通过lambda和不通过lambda调用函数的规则/过程是什么?以下是示例。显然,如果不使用lambda,则整个系列(df [列名])将传递到“test”函数中,试图在一系列上执行布尔运算会引发错误。
如果使用lambda调用相同的函数,则可以正常工作。对每一行进行迭代,并将每一行作为“x”传递,df [列名]返回当前行中该列的单个值。
这就像lambda删除了一个维度。有人能解释一下或指向具体的文档吗?谢谢。
示例1:使用lambda,可以正常工作。
print("probPredDF columns:", probPredDF.columns)

def test( x, y):
    if x==y:
        r = 'equal'
    else:
        r = 'not equal'
    return r    

probPredDF.apply( lambda x: test( x['yTest'], x[ 'yPred']), axis=1 ).head()

示例1输出

probPredDF columns: Index([0, 1, 'yPred', 'yTest'], dtype='object')

Out[215]:
0    equal
1    equal
2    equal
3    equal
4    equal
dtype: object

第二个例子没有使用lambda,会抛出“对序列的布尔操作”错误

print("probPredDF columns:", probPredDF.columns)

def test( x, y):
    if x==y:
        r = 'equal'
    else:
        r = 'not equal'
    return r    

probPredDF.apply( test( probPredDF['yTest'], probPredDF[ 'yPred']), axis=1 ).head()

示例 2 输出

ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

请在此问题中使用代码格式,否则很难解读。 - elPastor
@piRSquared 我觉得我还太菜了。上次我尝试编辑时,它告诉我编辑队列已满。从那以后我就远离它了。 - elPastor
1个回答

10

lambda并没有什么魔法。它们是一元函数,可以内联定义,没有名称。您可以在期望使用lambda的地方使用函数,但该函数也需要接收一个参数。您需要像这样做...

将其定义为:

def wrapper(x):
    return test(x['yTest'], x['yPred'])

用法:

probPredDF.apply(wrapper, axis=1)

加一是个好答案,但我不同意!lambda确实有一些神奇的地方。 - piRSquared
1
在许多层面上,我仍然认为Python是神奇的,因为它使我作为程序员异常高效。但我不认为lambda比解析更神奇,当然也比装饰器少一些魔力... :-) - Stephen Rauch
没有争议,你说得对。 - piRSquared
1
太棒了!我已经使用apply传递函数很长时间了,但从未想过将它们放在包装器中。这样调用会更加清晰易懂。 - Woody Pride

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接