首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Tilde negation过滤掉空值

Tilde negation过滤掉空值
EN

Stack Overflow用户
提问于 2021-09-20 15:01:01
回答 1查看 66关注 0票数 2

我想知道有没有解决这个问题的好办法

下面是我的未过滤数据帧deltas,它是源数据集和目标数据集之间的full join的结果:

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

代码语言:javascript
复制
deltas = deltas.filter(~deltas['tgt_property_owner_type'].isin(['Unknown', 'Not Specified']))

但是,运行带有代字号的display(deltas)不会返回任何结果。我想这是因为这些行对于列来说是null的,所以它也排除了那些行,因为它不能确定它们不是“未知”或“未指定”。但是,上面的正版本(即没有代字号)只返回第5行和第6行,而不返回nulls。

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

代码语言:javascript
复制
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,或者在临时视图中运行它并使用SQL进行排序,但是我想知道是否有更纯粹的python语法可以使用。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-09-20 17:44:01

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

代码语言:javascript
复制
c = 'tgt_property_owner_type'
m = deltas[c].isin(['Unknown', 'Not Specified']) & deltas[c].isNotNull()

deltas = deltas.filter(~m)

给定数据帧df

代码语言:javascript
复制
df.show()
+---+---+----+
|  A|  B|   C|
+---+---+----+
|  1| r2|   x|
|  3| r1|null|
|  3| r2|   y|
|  4| r1|   z|
|  5| r2|null|
|  5| r1|   p|
+---+---+----+

以下是如何工作的示例

代码语言:javascript
复制
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|
+---+---+----+
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69256647

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档