繁体   English   中英

根据多个条件删除 PySpark 数据框中的行

[英]Delete rows in PySpark dataframe based on multiple conditions

我有一个结构类似于以下的数据框:

col1, col2, col3, col4
A,A,A,A
A,B,C,D
B,C,A,D
A,C,A,D
A,F,A,A
A,V,B,A

我想要的是“删除”同时满足所有列条件的行。 例如,同时删除col1 == Acol2 == C行。 请注意,在这种情况下,唯一应该删除的行是"A,C,A,D"因为它是唯一同时满足两个条件的行。 因此,数据框应如下所示:

col1, col2, col3, col4
A,A,A,A
A,B,C,D
B,C,A,D
A,F,A,A
A,V,B,A

到目前为止我尝试过的是:

# spark library import
import pyspark.sql.functions as F

df = df.filter(
               ((F.col("col1") != "A") & (F.col("col2") != "C"))
               )

这个没有按照我的意愿过滤,因为它删除了只满足一个条件的所有行,比如col1 == "A"col2 == "C" ,返回:

col1, col2, col3, col4
B,C,A,D

有人可以帮我解决这个问题吗?

谢谢

from pyspark.sql.functions import when
df.withColumn('Result',when(df.col1!='A',"True").when(df.col2!='C',"True")).filter("Result==True").drop("Result").show()

这对您来说可能是一个可行的解决方案 - 使用when()条件并根据您希望的条件创建一列

在此处创建 DF

df = spark.createDataFrame([("A", "A", "A", "A"),("A", "B", "C", "D"),("B", "C", "A", "D"),("A", "C", "A", "D"), ("A", "F", "A", "A"), ("A", "V", "B", "A")],[ "col1","col2", "col3", "col4"])
+----+----+----+----+
|col1|col2|col3|col4|
+----+----+----+----+
|A   |A   |A   |A   |
|A   |B   |C   |D   |
|B   |C   |A   |D   |
|A   |C   |A   |D   |
|A   |F   |A   |A   |
|A   |V   |B   |A   |
+----+----+----+----+

当条件为

df = df.withColumn("filter_col", F.when(((F.col("col1") == F.lit("A")) & (F.col("col2") == F.lit("C"))), F.lit("1")))
df.show()
+----+----+----+----+----------+
|col1|col2|col3|col4|filter_col|
+----+----+----+----+----------+
|   A|   A|   A|   A|      null|
|   A|   B|   C|   D|      null|
|   B|   C|   A|   D|      null|
|   A|   C|   A|   D|         1|
|   A|   F|   A|   A|      null|
|   A|   V|   B|   A|      null|
+----+----+----+----+----------+

现在过滤掉该行

df = df.filter(F.col("filter_col").isNull()).select("col1", "col2", "col3", "col4")
df.show()
   +----+----+----+----+
|col1|col2|col3|col4|
+----+----+----+----+
|   A|   A|   A|   A|
|   A|   B|   C|   D|
|   B|   C|   A|   D|
|   A|   F|   A|   A|
|   A|   V|   B|   A|
+----+----+----+----+

结合两个条件并执行NOT

cond = (F.col('col1') == 'A') & (F.col('col2') == 'C')

df.filter(~cond)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM