带有和不带有lambda的熊猫apply()

Tom*_*ron 3 lambda apply pandas

apply()通过lambda与非pandas调用函数时的规则/过程是什么?下面的例子。显然没有lambda,整个序列(df [column name])将传递给“ test”函数,该函数会在尝试对序列执行布尔操作时引发错误。

如果通过lambda调用了相同的函数,则它将起作用。遍历每行,每行以“ x”进行迭代,并且df [列名]返回当前行中该列的单个值。

就像lambda正在移除尺寸。有人对此有解释或指向特定文档吗?谢谢。

带有lambda的示例1,可以正常工作

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()
Run Code Online (Sandbox Code Playgroud)

示例1的输出

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

Out[215]:
0    equal
1    equal
2    equal
3    equal
4    equal
dtype: object
Run Code Online (Sandbox Code Playgroud)

没有lambda的示例2,在系列错误时引发布尔运算

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()
Run Code Online (Sandbox Code Playgroud)

示例2输出

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

Ste*_*uch 5

一个机器人没什么魔术的lambda。它们是一个参数中的函数,可以内联定义,并且没有名称。您可以在需要使用lambda的函数中使用该函数,但是该函数还需要采用一个参数。您需要做类似...

将其定义为:

def wrapper(x):
    return test(x['yTest'], x['yPred'])
Run Code Online (Sandbox Code Playgroud)

用作:

probPredDF.apply(wrapper, axis=1)
Run Code Online (Sandbox Code Playgroud)