pandas apply()有和没有lambda

时间:2017-05-05 16:48:56

标签: pandas lambda apply

通过lambda而不是pandas apply()调用函数时,规则/进程是什么?以下示例。显然没有lambda,整个系列(df [列名])被传递给"测试"尝试对系列执行布尔操作时抛出错误的函数。

如果通过lambda调用相同的函数,它就可以工作。对每一行进行迭代,每次都传递为" x"并且df [column name]返回当前行中该列的单个值。

就像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的示例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()

示例2输出

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

1 个答案:

答案 0 :(得分:5)

lambda没有什么神奇之处。它们是一个参数中的函数,可以内联定义,也没有名称。您可以使用需要lambda的函数,但该函数还需要一个参数。你需要做一些像......

将其定义为:

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

将其用作:

probPredDF.apply(wrapper, axis=1)