python lambda VS.def func():

python lambda VS.def func():,python,pandas,Python,Pandas,以下两个函数应该是相同的,但当我使用lambda时,我不断得到 “ValueError:('序列的真值不明确。请使用a.empty, a、 bool()、a.item()、a.any()或a.all()',u'出现在索引0')” lambda不工作的原因是什么 ------这会产生错误------------- df['flag']=df.apply(如果df.a>df.b或df.adf.b: 返回1 elif df.adf.b: 返回1 elif df.adf.b)|(df.ax.b或x.ad

以下两个函数应该是相同的,但当我使用lambda时,我不断得到

“ValueError:('序列的真值不明确。请使用a.empty, a、 bool()、a.item()、a.any()或a.all()',u'出现在索引0')”

lambda不工作的原因是什么

------这会产生错误-------------

df['flag']=df.apply(如果df.a>df.b或df.a
--------然而,这是可行的------------

def标记(df):
如果df.a>df.b:
返回1
elif df.a
错误说明您正在将数组与标量进行比较,这在语义上与仅比较标量值不同:

In [55]:    
df = pd.DataFrame(np.random.randn(5,3), columns=list('abc'))
df

Out[55]:
          a         b         c
0  0.273142 -0.961078  0.715027
1  0.131964  1.049724 -0.928581
2 -1.015484 -1.927166 -1.633281
3  0.766749 -0.312187 -0.473424
4 -0.427227  1.105844 -0.125702
如果将lambda更改为使用实际行值,则它将根据需要工作:

In [56]:
df['flag']= df.apply(lambda x: 1 if (x.a> x.b) | (x.a < x.c) else 0, axis=1)
df

Out[56]:
          a         b         c  flag
0  0.273142 -0.961078  0.715027     1
1  0.131964  1.049724 -0.928581     0
2 -1.015484 -1.927166 -1.633281     1
3  0.766749 -0.312187 -0.473424     1
4 -0.427227  1.105844 -0.125702     1
这在整个df上使用布尔掩码,然后以矢量化方式设置行值

计时

In [61]:
%%timeit
def flagout(df):
    if df.a> df.b:
        return 1
    elif df.a< df.c:
        return 1
    else:
        return 0
​
df.apply(flagout, axis=1)

1 loops, best of 3: 284 ms per loop

In [59]:

%timeit np.where((df.a> df.b) | (df.a < df.c),1,0)
1000 loops, best of 3: 560 µs per loop
[61]中的

%%时间
def标志(df):
如果df.a>df.b:
返回1
elif df.adf.b)|(df.a

您可以看到,在4k行df上,
np。其中
快了约600倍

我不认为lambda等同于函数flagout


如果x.a>x.b或x.alambda x:1,以便与函数等效。

是否
df['flag']=df.apply(lambda x:1如果(df.a>df.b)|(df.a
起作用?您的
lambda
忽略其参数,但函数不起作用。
def flagout(df):
接受一个参数
df
lambda x:
接受
x
作为参数名(但仍然在其主体中使用
df
,它引用了其他内容).您的lambda和函数有点奇怪,因为您正在逐行迭代并在方法版本中传递该行,但在lambda中,您正在逐行迭代,但试图比较整个dfget。错误在我使用的lambda中。而不是实参数x。现在它工作得很好。谢谢
In [56]:
df['flag']= df.apply(lambda x: 1 if (x.a> x.b) | (x.a < x.c) else 0, axis=1)
df

Out[56]:
          a         b         c  flag
0  0.273142 -0.961078  0.715027     1
1  0.131964  1.049724 -0.928581     0
2 -1.015484 -1.927166 -1.633281     1
3  0.766749 -0.312187 -0.473424     1
4 -0.427227  1.105844 -0.125702     1
df['flag']= df.apply(lambda x: 1 if df.a> df.b or df.a < df.c else 0, axis=1)
In [57]:
df['flag']= np.where((df.a> df.b) | (df.a < df.c),1,0)
df

Out[57]:
          a         b         c  flag
0  0.273142 -0.961078  0.715027     1
1  0.131964  1.049724 -0.928581     0
2 -1.015484 -1.927166 -1.633281     1
3  0.766749 -0.312187 -0.473424     1
4 -0.427227  1.105844 -0.125702     1
In [61]:
%%timeit
def flagout(df):
    if df.a> df.b:
        return 1
    elif df.a< df.c:
        return 1
    else:
        return 0
​
df.apply(flagout, axis=1)

1 loops, best of 3: 284 ms per loop

In [59]:

%timeit np.where((df.a> df.b) | (df.a < df.c),1,0)
1000 loops, best of 3: 560 µs per loop