代码之家  ›  专栏  ›  技术社区  ›  Derek Krantz

大熊猫“&”与“与”的区别

  •  -1
  • Derek Krantz  · 技术社区  · 6 年前

    我有一些代码可以在cron(通过kubernetes)上运行几个月。

    昨天,我的部分代码不能正常工作:

    突然间,这句话不是“真的”(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"
    

    是否有某种代码推送会导致这种更改?因为我已经运行这个代码几个月了,所以不知道什么会导致这个语句突然失败。

    4 回复  |  直到 6 年前
        1
  •  2
  •   MSeifert    6 年前

    这个 len(df_temp > 0) len(df_temp4 > 0) 可能不会按你的期望去做。与pandas数据帧的比较运算符返回元素顺序的结果,这意味着它们创建一个布尔数据帧,其中每个值指示数据帧中的对应值是否大于零:

    >>> 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 属于 df 伦恩 属于 df > 0 :

    >>> len(df)
    3
    >>> len(df > 0)
    3
    

    “&和”与“之间的差异”

    它们意味着不同的事情:

    因为您特别询问了pandas(假设至少有一个操作数是numpy数组、pandas系列或pandas数据帧):

    • & 也指元素的“位与”。
    • 熊猫的“逻辑与”元素不是 但必须使用一个函数,即 numpy.logical_and .

    有关更多说明,请参阅 "Difference between 'and' (boolean) vs. '&' (bitwise) in python. Why difference in behavior with lists vs numpy arrays?"

    不知道什么会导致这个声明突然失效。

    你没有提供“失败”或预期的行为,所以不幸的是,我不能帮助你。

        2
  •  1
  •   BobyCloud    6 年前

    他们的行为完全不同。
    当你使用 & ,您正在比较布尔值,但当您使用 and 你是元素的逻辑和。我建议你阅读这个完整的答案来了解更多。
    Logic operator for boolean indexing in Pandas

        3
  •  0
  •   Rawad Daher    6 年前

    从逻辑上讲,这两种说法是不同的。 &indicate位运算符。 和表示逻辑与。

        4
  •  0
  •   Grzegorz Å»ur    6 年前

    您替换了错误应用的位运算符 & 有适当的逻辑 and 操作员。

    首先,你应该使用 运算符,因为您真正需要的是带有逻辑运算符的逻辑表达式。

    按位 & 当长度没有公共位时,运算符失败。

    在python中尝试以下操作。

    True and 1 & 1
    True and 1 & 2