python - 波形符否定过滤掉空值

标签 python pyspark databricks

我想知道是否有一个巧妙的方法来解决这个问题

这是我未过滤的数据帧,deltas,它是源数据集和目标数据集之间完全连接的结果: enter image description here

我想删除“未知”和“未指定”值(即第 5 行和第 6 行),因此我使用波浪号删除这些行:

deltas = deltas.filter(~deltas['tgt_property_owner_type'].isin(['Unknown', 'Not Specified']))

但是,使用波形符运行 display(deltas) 不会返回任何结果。我想这是因为这些行对于列来说是 null ,它也排除了这些行,因为它不能肯定地说它们不是“未知”或“未指定”。但是,上述内容的正版本(即无波形符)仅返回第 5 行和第 6 行,而不返回 null

这是我的临时解决方案,有效:

deltas = deltas.withColumn("IsMissingKValue",\
                            when(deltas.tgt_property_owner_type.isin(['Unknown', 'Not Specified']),True) \
                           .otherwise(False))
deltas = deltas.filter(deltas['IsMissingKValue'] == False)

是否有一种聪明的方法可以让波形符否定在求值期间忽略 null ?我知道一些解决方法,例如用空白字符串替换 null 或将其运行到临时 View 中并使用 SQL 对其进行排序,但想知道是否有更纯粹的 python 语法可以使用过。

最佳答案

您可以创建一个谓词m,当您想要检查列是否包含某些字符串时,它将忽略空值,并且当您否定此谓词时,这将返回列不包含某些字符串的行字符串加上 null

c = 'tgt_property_owner_type'
m = deltas[c].isin(['Unknown', 'Not Specified']) & deltas[c].isNotNull()

deltas = deltas.filter(~m)

给定数据框df

df.show()
+---+---+----+
|  A|  B|   C|
+---+---+----+
|  1| r2|   x|
|  3| r1|null|
|  3| r2|   y|
|  4| r1|   z|
|  5| r2|null|
|  5| r1|   p|
+---+---+----+

这是如何工作的示例

m = df['C'].isin(['x', 'y']) & df['C'].isNotNull()

df.filter(m).show()
+---+---+---+
|  A|  B|  C|
+---+---+---+
|  1| r2|  x|
|  3| r2|  y|
+---+---+---+

df.filter(~m).show()
+---+---+----+
|  A|  B|   C|
+---+---+----+
|  3| r1|null|
|  4| r1|   z|
|  5| r2|null|
|  5| r1|   p|
+---+---+----+

关于python - 波形符否定过滤掉空值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69256647/

相关文章:

python - 使用 header 和特定文件名将 spark 数据帧导出到 .csv

python - 无法从 pyspark 读取 keystore 文件

Databricks 删除增量表?

azure - 使用/mnt/将数据从 Azure Blob 存储读取到 Azure Databricks

python - PIL - 需要抖动,但限制调色板会导致问题

python - 如何在 apscheduler 的事件作业中添加失火宽限期和合并?

python - 跨 numpy 矩阵的映射函数

python - 如何将 Vector 拆分成列 - 使用 PySpark

python - 在 discord.py 中更改昵称会引发错误

apache-spark-sql - 如何更改 Databricks 中文本输入小部件的默认值?