带和不带 lambda 的 pandas apply()

Posted

技术标签:

【中文标题】带和不带 lambda 的 pandas apply()【英文标题】:pandas apply() with and without lambda 【发布时间】:2017-10-04 05:44:47 【问题描述】:

当通过 lambda 与不使用 pandas apply() 调用函数时,规则/过程是什么?下面的例子。显然,如果没有 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()

示例 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().

【问题讨论】:

请使用此问题的代码格式,否则很难破译。 @piRSquared 我觉得我还是太低级了。上次我尝试它告诉我编辑队列已满。从那以后我就离开了。 【参考方案1】:

lambda 没有什么神奇之处。它们是一个参数中的函数,可以内联定义,并且没有名称。您可以在需要 lambda 的地方使用函数,但该函数还需要采用一个参数。你需要做类似...

定义为:

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

将其用作:

probPredDF.apply(wrapper, axis=1)

【讨论】:

加一,因为这是一个很好的答案……但我不得不不同意! lambda 的神奇之处。 嗯,在很多层面上,我仍然觉得 python 很神奇,因为它让我作为一名程序员的工作效率高得离谱。但我不认为 lambda 包含比推导更多的魔力,当然也没有装饰器那么魔力...... :-) 触摸...这里没有参数 真是个好主意。我一直在传递函数来申请年龄,但从未想过将它们放入包装器中。让通话更清晰。

以上是关于带和不带 lambda 的 pandas apply()的主要内容,如果未能解决你的问题,请参考以下文章

带和不带 FILTER 的 DAX 计算函数

带和不带 () 的条件运算符

带和不带的 SQL 查询

在mysql中执行带和不带索引的查询

带和不带引号和括号的 setTimeout 之间的区别

在 Hive 中处理带和不带双引号的数据