我有一些代码(通过kubernetes)在cron上运行了几个月。
昨天,我的部分代码无法正常工作:
这句话突然间不是“ True”(df_temp和df_temp4都包含数据:
if ( len(df_temp > 0) & len(df_temp4 > 0)):
print "HERE"
但是,这可行:
if ( len(df_temp > 0) and len(df_temp4 > 0)):
print "HERE"
是否存在某种会导致此更改的代码推送?由于我已经运行了几个月的代码,所以不确定是什么导致该语句突然失败。
答案 0 :(得分:2)
len(df_temp > 0)
和len(df_temp4 > 0)
可能没有达到您的期望。带有pandas DataFrames的比较运算符将返回按元素计算的结果,这意味着它们将创建一个布尔型DataFrame,其中每个值都表明DataFrame中的对应值是否大于零:
>>> import pandas as pd
>>> df = pd.DataFrame({'a': [-1,0,1], 'b': [-1,0,1]})
>>> df
a b
0 -1 -1
1 0 0
2 1 1
>>> df > 0
a b
0 False False
1 False False
2 True True
因此len
的{{1}}与df
的{{1}}相同:
len
“&”和“ and”之间的区别
它们的含义不同:
df > 0
是bitwise and >>> len(df)
3
>>> len(df > 0)
3
是logical and(并短路)由于您专门询问了熊猫(假设至少一个操作数是NumPy数组,pandas系列或pandas DataFrame):
&
也指逐元素的“按位与”。 and
,而是必须使用一种函数,即numpy.logical_and
。不确定导致该语句突然失败的原因。
您没有提供“失败”或预期的行为,因此很遗憾,我在这里无法为您提供帮助。
答案 1 :(得分:1)
他们的行为完全不同。
当您使用&
时,您正在比较布尔值,但是当您使用and
时,您在逻辑上是和。建议您阅读完整的答案以了解更多信息。
Logic operator for boolean indexing in Pandas
答案 2 :(得分:0)
您用错误的逻辑&
运算符替换了错误应用的位运算符and
。
首先,您应该使用and
运算符,因为您真正想要的是带有逻辑运算符的逻辑表达式。
当长度没有公共位时,按位&
运算符将失败。
在Python中尝试以下操作。
True and 1 & 1
True and 1 & 2
答案 3 :(得分:0)
逻辑上,这两个语句是不同的。 &表示按位运算符。 AND表示逻辑与。