波浪号否定过滤掉空值
Tilde negation filtering out nulls
我想知道是否有解决这个问题的巧妙方法
这是我未过滤的数据框 deltas
,它是源数据集和目标数据集之间 full join
的结果:
我想删除 'Unknown' 和 'Not Specified' 值(即第 5 行和第 6 行),所以我使用波浪号删除了这些行:
deltas = deltas.filter(~deltas['tgt_property_owner_type'].isin(['Unknown', 'Not Specified']))
但是,运行 一个带有 returns 波浪号的 display(deltas)
没有结果。我想这是因为这些行对于列来说是 null
,它也排除了那些,因为它不能肯定地说它们不是 'Unknown' 或 'Not Specified'。但是,上面的正版本(即没有波浪号)returns 只是第 5 行和第 6 行,而不是 null
s.
这是我的临时解决方案,有效:
deltas = deltas.withColumn("IsMissingKValue",\
when(deltas.tgt_property_owner_type.isin(['Unknown', 'Not Specified']),True) \
.otherwise(False))
deltas = deltas.filter(deltas['IsMissingKValue'] == False)
是否有一种聪明的方法可以让波浪号否定在评估期间忽略 null
s?我知道一些解决方法,例如将 null
s 替换为空白字符串或将 运行 替换为临时视图并使用 SQL 对其进行排序,但想知道是否有更纯粹的python 可以使用的语法。
您可以创建一个谓词 m
,当您要检查列是否包含某些字符串时,它将忽略空值,并且当您否定该谓词时,这将 return 列包含的行不包括某些字符串加上 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|
+---+---+----+
我想知道是否有解决这个问题的巧妙方法
这是我未过滤的数据框 deltas
,它是源数据集和目标数据集之间 full join
的结果:
我想删除 'Unknown' 和 'Not Specified' 值(即第 5 行和第 6 行),所以我使用波浪号删除了这些行:
deltas = deltas.filter(~deltas['tgt_property_owner_type'].isin(['Unknown', 'Not Specified']))
但是,运行 一个带有 returns 波浪号的 display(deltas)
没有结果。我想这是因为这些行对于列来说是 null
,它也排除了那些,因为它不能肯定地说它们不是 'Unknown' 或 'Not Specified'。但是,上面的正版本(即没有波浪号)returns 只是第 5 行和第 6 行,而不是 null
s.
这是我的临时解决方案,有效:
deltas = deltas.withColumn("IsMissingKValue",\
when(deltas.tgt_property_owner_type.isin(['Unknown', 'Not Specified']),True) \
.otherwise(False))
deltas = deltas.filter(deltas['IsMissingKValue'] == False)
是否有一种聪明的方法可以让波浪号否定在评估期间忽略 null
s?我知道一些解决方法,例如将 null
s 替换为空白字符串或将 运行 替换为临时视图并使用 SQL 对其进行排序,但想知道是否有更纯粹的python 可以使用的语法。
您可以创建一个谓词 m
,当您要检查列是否包含某些字符串时,它将忽略空值,并且当您否定该谓词时,这将 return 列包含的行不包括某些字符串加上 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|
+---+---+----+