【问题标题】:Delete null values in a column based on a group column根据组列删除列中的空值
【发布时间】:2022-01-08 06:45:50
【问题描述】:

我有一个包含组、ID 和目标列的数据集。我试图通过 Group 列消除空目标值,忽略 ID 列。我想在 PySpark 中执行此操作。

| Group | ID  | Target   |
| ----- | --- | -------- |
| A     | B   |  10      |
| A     | B   |  10      |
| A     | B   |  10      |
| A     | C   | null     |
| A     | C   | null     |
| A     | C   | null     |
| B     | D   | null     |
| B     | D   | null     |
| B     | D   | null     |

这是我正在寻找的结果数据集:

| Group | ID  | Target   |
| ----- | --- | -------- |
| A     | B   |  10      |
| A     | B   |  10      |
| A     | B   |  10      | 
| B     | D   | null     |
| B     | D   | null     |
| B     | D   | null     |

换句话说,如果组已经有一个目标值,我不需要该组中具有空目标的值,无论它们的 ID 是什么。但是,我需要确保每个组都有一个不为空的目标,所以如果有一个组只有空目标,它们就不能被删除。

【问题讨论】:

    标签: pyspark null


    【解决方案1】:

    您可以为每个组计算 max(target) 并将其分配给该组中的所有行。然后过滤行,如果最大值为空,则选择该行,如果最大值不为空且目标也不为空。

    
    from pyspark.sql import functions as F
    from pyspark.sql import Window
    
    data = [("A", "B", 10),
     ("A", "B", 10),
     ("A", "B", 10),
     ("A", "C", None),
     ("A", "C", None),
     ("A", "C", None),
     ("B", "D", None),
     ("B", "D", None),
     ("B", "D", None),]
    
    df = spark.createDataFrame(data, ("Group", "ID", "Target",))
    
    
    window_spec = Window.partitionBy("Group")
    
    df.withColumn("max_target", F.max("Target").over(window_spec))\
      .filter((F.col("max_target").isNull()) | 
              (F.col("Target").isNotNull() & F.col("max_target").isNotNull()))\
      .drop("max_target")\
      .show()
    
    

    输出

    +-----+---+------+
    |Group| ID|Target|
    +-----+---+------+
    |    A|  B|    10|
    |    A|  B|    10|
    |    A|  B|    10|
    |    B|  D|  null|
    |    B|  D|  null|
    |    B|  D|  null|
    +-----+---+------+
    

    【讨论】:

    • 是的,这行得通!谢谢!出于好奇,如果我在 Target 列中每个组有多个值,并且想将它们收集到一个数组中,但仍想消除 Null,该怎么办?
    • 您可以在输出顶部应用collect_list spark.apache.org/docs/latest/api/python/reference/api/…collect_list 仅收集非空值。
    猜你喜欢
    • 1970-01-01
    • 2020-07-12
    • 2019-07-06
    • 2017-06-26
    • 2022-10-06
    • 2015-11-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多