【问题标题】:Tilde negation filtering out nulls波浪号否定过滤掉空值
【发布时间】:2021-09-20 15:01:00
【问题描述】:

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

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

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

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

但是,使用波浪号运行 display(deltas) 不会返回任何结果。我想这是因为这些行是列的null,它也排除了那些行,因为它不能确定它们不是“未知”或“未指定”。但是,上述的正数版本(即没有波浪号)只返回第 5 行和第 6 行,而不是 nulls。

这是我的临时解决方案,可行:

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

是否有一种聪明的方法可以让波浪号否定在评估期间忽略nulls?我知道一些变通方法,例如用空白字符串替换 nulls 或将其运行到临时视图中并使用 SQL 对其进行排序,但想知道是否可以使用更纯的 python 语法。

【问题讨论】:

    标签: python pyspark databricks


    【解决方案1】:

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

    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|
    +---+---+----+
    

    【讨论】:

    • 谢谢,看来可以了,明天试试,然后报告。
    • 今天检查了,准确,谢谢,非常整洁。
    • @TJB 编码快乐!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-07
    • 2012-10-22
    • 1970-01-01
    • 2022-06-14
    • 1970-01-01
    • 2013-07-25
    • 2019-04-09
    相关资源
    最近更新 更多