【问题标题】:How to negate multiple filter condition at same time如何同时否定多个过滤条件
【发布时间】:2022-01-24 15:20:57
【问题描述】:

示例:我有一个类似的数据框

我想用否定过滤多个条件firstname == "James" & lastname == "Smith" or firstname == "Robert" & lastname == "Williams"

我需要的输出应该是 我正在使用类似的东西,但它不起作用

df = df.filter(~(df.firstname == "James") & (df.lastname == "Smith")|~(df.firstname == "Robert") & (df.lastname == "Williams"))

【问题讨论】:

  • 请在问题正文中说明您的情况,至于您要过滤什么
  • 我已经修改好了吗?我知道获得所需输出的逻辑,但我想使用数据框过滤器对多个条件使用否定

标签: python pandas dataframe apache-spark pyspark


【解决方案1】:

A|B 的否定是(~A)&(~B)

所以试试这个:

df = df.filter((~(firstname == "James" & lastname == "Smith")) & (~(firstname == "Robert" & lastname == "Williams")))

因为C&D的否定是(~C)|(~D),你可以进一步简化你的过滤条件为

df = df.filter((firstname != "James" | lastname != "Smith") & (firstname != "Robert" | lastname != "Williams"))

【讨论】:

    【解决方案2】:

    这里的 OR 条件没有给出正确的输出。我们必须将其更改为 AND

    df_new = (df
              .filter(~((F.col("firstname") == "James") & (F.col("lastname") == "Smith"))
                      & ~((F.col("firstname") == "Robert") & (F.col("lastname") == "Williams"))
                     )
             )
    

    结果如下 -

    【讨论】:

    • 括号中的否定表达式我试过了,我也在寻找否定过滤器内多个条件的答案
    • 我已经更新了我的答案,检查
    【解决方案3】:

    您必须对整个条件应用否定。

    
    data = [("James","","Smith","36636","M",3000),
        ("Michael","Rose","jim","40288","M",4000),
        ("Robert","","Williams","42114","M",4000),
        ("Maria","Anne","Jones","39192","F",4000),
        ("Jen","Mary","Brown","60563","F",-1)]
    
    df = spark.createDataFrame(data, ("firstname", "middlename", "lastname", "id", "gender", "salary", ))
    
    (df.filter(~(((df.firstname == "James") & (df.lastname == "Smith")) |
                 ((df.firstname == "Robert") & (df.lastname == "Williams"))
                )
              )
       .show())
    

    输出

    +---------+----------+--------+-----+------+------+
    |firstname|middlename|lastname|   id|gender|salary|
    +---------+----------+--------+-----+------+------+
    |  Michael|      Rose|     jim|40288|     M|  4000|
    |    Maria|      Anne|   Jones|39192|     F|  4000|
    |      Jen|      Mary|   Brown|60563|     F|    -1|
    +---------+----------+--------+-----+------+------+
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-07
      • 2015-09-04
      • 1970-01-01
      • 2018-12-05
      相关资源
      最近更新 更多