python lambda VS.def func():
以下两个函数应该是相同的,但当我使用lambda时,我不断得到 “ValueError:('序列的真值不明确。请使用a.empty, a、 bool()、a.item()、a.any()或a.all()',u'出现在索引0')” lambda不工作的原因是什么 ------这会产生错误-------------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
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.a
lambda 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