【问题标题】:Combine rows in pyspark dataframe to fill in empty columns组合 pyspark 数据框中的行以填充空列
【发布时间】:2023-02-14 12:03:31
【问题描述】:

我有以下 pyspark 数据框

Car Time Val1 Val2 Val 3
1 1 None 1.5 None
1 1 3.5 None None
1 1 None None 3.4
1 2 2.5 None None
1 2 None 6.0 None
1 2 None None 7.3

我想填补空白并使用 car/time 列作为排序键组合这些行。具体来说,如果两行(或更多行)的汽车/时间列相同,则将所有行合并为一行。重复行保证只填写Val1/Val2/Val中的一个。您永远不会遇到两行在 car/time 列中具有相同值,但在另一列中具有不同/非 None 值的情况。因此,生成的数据框应该如下所示。

Car Time Val1 Val2 Val3
1 1 3.5 1.5 3.4
1 2 2.5 6.0 7.3

在此先感谢您的帮助

【问题讨论】:

    标签: python pyspark


    【解决方案1】:

    您可以将 group by 与聚合函数 First 结合使用,并将标志 ingnorenulls 设置为 true

    import pyspark.sql.functions as F
    from pyspark.sql import Window
    
    data = [
        {"Car": 1, "Time": 1, "Val1": None, "Val2": 1.5, "Val3": None},
        {"Car": 1, "Time": 1, "Val1": 3.5, "Val2": None, "Val3": None},
        {"Car": 1, "Time": 1, "Val1": None, "Val2": None, "Val3": 3.4},
        {"Car": 1, "Time": 2, "Val1": 2.5, "Val2": None, "Val3": None},
        {"Car": 1, "Time": 2, "Val1": None, "Val2": 6.0, "Val3": None},
        {"Car": 1, "Time": 2, "Val1": None, "Val2": None, "Val3": 7.3},
        {"Car": 2, "Time": 3, "Val1": None, "Val2": None, "Val3": 9.2},
    ]
    
    df = spark.createDataFrame(data)
    
    df.groupBy("Car", "Time").agg(
        F.first("Val1", ignorenulls=True).alias("Val1"),
        F.first("Val2", ignorenulls=True).alias("Val1"),
        F.first("Val3", ignorenulls=True).alias("Val1"),
    ).show()
    

    我添加了一个额外的行只是为了检查它只有一个条目的行为,我觉得很好

    输出是

    +---+----+----+----+----+
    |Car|Time|Val1|Val1|Val1|
    +---+----+----+----+----+
    |  1|   1| 3.5| 1.5| 3.4|
    |  1|   2| 2.5| 6.0| 7.3|
    |  2|   3|null|null| 9.2|
    +---+----+----+----+----+
    

    【讨论】:

      猜你喜欢
      • 2020-11-29
      • 1970-01-01
      • 1970-01-01
      • 2021-12-07
      • 2020-08-30
      • 2018-04-09
      • 2018-01-06
      • 2016-10-11
      • 1970-01-01
      相关资源
      最近更新 更多