【问题标题】:difference between "&" and "and" in pandaspandas中“&”和“and”的区别
【发布时间】:2019-06-16 08:35:06
【问题描述】:

我现在有一些代码在 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"

是否有某种代码推送会导致这种变化?由于我已经运行了这个代码几个月,不知道是什么导致这个语句突然失败。

【问题讨论】:

  • 我猜这次它们的长度没有任何重叠位。
  • 你这是什么意思? @tkausl
  • 嗯,&按位 和运算符。
  • 奇怪的是它总是有效 - 所以正确的语法是使用“and”?
  • @DerekKrantz:在这种情况下,您可以写len(df_temp) > 0 甚至只是len(df_temp) - 即您的条件应该是if len(df_temp) and len(df_temp4):

标签: python pandas dataframe


【解决方案1】:

您将错误应用的位运算符 & 替换为正确的逻辑 and 运算符。

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

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

在 Python 中尝试以下操作。

True and 1 & 1
True and 1 & 2

【讨论】:

  • 更具体地说,我很困惑为什么这个声明:df_temp = df[(df.funding_date >= begin_of_month) & (df.funding_date
【解决方案2】:

从逻辑上讲,这两个语句是不同的。 & 表示按位运算符。 AND 表示逻辑与。

【讨论】:

    【解决方案3】:

    他们有完全不同的行为。
    当您使用and 时,您是在比较布尔值,但是当您使用& 时,您是元素明智的逻辑与。我建议您阅读此完整答案以了解更多信息。
    Logic operator for boolean indexing in Pandas

    import pandas as pd
    
    dfa = pd.DataFrame([True, False])
    dfb = pd.DataFrame([False, False])
    
    print(dfa & dfb)
    #    0
    # 0  False
    # 1  False
    
    print(dfa and dfb)
    # ValueError: The truth value of a DataFrame is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
    

    【讨论】:

    • 您的答案不正确。如果你想在 pandas 中按元素逻辑和,请使用 & 二元运算符执行
    【解决方案4】:

    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
    

    所以dflendf > 0len 相同:

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

    “&”和“and”的区别

    它们的含义不同:

    由于您专门询问了 pandas(假设至少有一个操作数是 NumPy 数组、pandas Series 或 pandas DataFrame):

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

    更多解释可以参考"Difference between 'and' (boolean) vs. '&' (bitwise) in python. Why difference in behavior with lists vs numpy arrays?"

    不知道什么会导致这个语句突然失败。

    您没有提供“失败”或预期的行为,所以很遗憾我无法帮助您。

    【讨论】:

      猜你喜欢
      • 2011-05-05
      • 2012-05-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-10
      相关资源
      最近更新 更多