Pyspark:过滤多列上的行

Posted

技术标签:

【中文标题】Pyspark:过滤多列上的行【英文标题】:Pyspark: Filtering rows on multiple columns 【发布时间】:2021-03-25 05:42:31 【问题描述】:

我有一个数据框,我想按以下条件过滤数据。

df = spark.createDataFrame([(101, 1, 2, 12, 34), (102, 1, 1, 45, 12), (103, 1, 34, 10, 0), (104, None, 2, 91, 76), (
    105, 2, 67, 23, 54), (107, 34, 255, 234, 99), (109, None, 1, 23, 55)], ['ID', 'A', 'B', 'C', 'D'])
df.show()

+---+----+---+---+---+
| ID|   A|  B|  C|  D|
+---+----+---+---+---+
|101|   1|  2| 12| 34|
|102|   1|  1| 45| 12|
|103|   1| 34| 10|  0|
|104|null|  2| 91| 76|
|105|   2| 67| 23| 54|
|107|  34|255|234| 99|
|109|null|  1| 23| 55|
+---+----+---+---+---+

过滤条件

    如果 A 列 = 1,则选择行 如果 A 列为空,则检查 B 列,如果 B 列 = 1,则选择行

预期输出

+---+----+---+---+---+
| ID|   A|  B|  C|  D|
+---+----+---+---+---+
|101|   1|  2| 12| 34|
|102|   1|  1| 45| 12|
|103|   1| 34| 10|  0|
|109|null|  1| 23| 55|
+---+----+---+---+---+

我的代码:

import pyspark.sql.functions as F
df = df.filter((F.col('A') ==1 )& (F.col('A').isNull()) & (F.col('B') ==1))
df.show()

我得到空的数据框。 有人能帮我吗。谢谢。

【问题讨论】:

【参考方案1】:

在条件12 之间需要| 条件而不是&

import pyspark.sql.functions as F
df.filter((F.col('A') == 1 ) | (F.col('A').isNull() & (F.col('B') ==1)))

【讨论】:

以上是关于Pyspark:过滤多列上的行的主要内容,如果未能解决你的问题,请参考以下文章

如何在过滤器和 lambda 函数 pyspark 中使用多列

多列上的pyspark条件并返回新列

PySpark 中具有多列的日期算术

如何根据pyspark中的行和列条件过滤多行

PySpark - 如何根据列中的两个值从数据框中过滤出连续的行块

过滤 pyspark 数据框中的行并创建一个包含结果的新列