前填充行具有第一个非缺失值

时间:2019-06-05 20:06:26

标签: python apache-spark pyspark apache-spark-sql

我有一张桌子,在第一个数字显示之后,需要重复该数字,然后填写所有列

这是一个表格示例:

student_id    2016Q1   2016Q2   2016Q3 2016Q4  2017Q1 2017Q2 2017Q3
1                        1
2                 1
3                                 1
4                                                1
5                                                1
6                                                        1
7                                                 1

我正在使用pyspark和Python。我尝试在excel中手动执行此操作,但这太多了手动编辑。我想知道pyspark或pyspark.sql中是否有任何函数能够生成下表。谢谢!

我希望结果看起来像下表

student_id    2016Q1   2016Q2   2016Q3 2016Q4  2017Q1 2017Q2 2017Q3
1                        1        1       1       1     1      1
2                 1      1        1       1       1     1      1
3                                 1       1       1     1      1
4                                                 1     1      1
5                                                 1     1      1
6                                                       1      1
7                                                 1     1      1

1 个答案:

答案 0 :(得分:0)

假设这些空格实际上是null s *,则可以使用pyspark.sql.functions.coalesce

枚举您的列,并coalesce列出当前列之前(包括当前列)的每一列的值。这将返回该行中的第一个非空值。

from pyspark.sql.functions import coalesce

fill_cols = df.columns[1:]  # exclude the student_id

df.select(
    "student_id",
    *[coalesce(*fill_cols[:i+1]).alias(c) for i, c in enumerate(fill_cols)]
).show()
#+----------+------+------+------+------+------+------+------+
#|student_id|2016Q1|2016Q2|2016Q3|2016Q4|2017Q1|2017Q2|2017Q3|
#+----------+------+------+------+------+------+------+------+
#|         1|  null|     1|     1|     1|     1|     1|     1|
#|         2|     1|     1|     1|     1|     1|     1|     1|
#|         3|  null|  null|     1|     1|     1|     1|     1|
#|         4|  null|  null|  null|  null|     1|     1|     1|
#|         5|  null|  null|  null|  null|     1|     1|     1|
#|         6|  null|  null|  null|  null|  null|     1|     1|
#|         7|  null|  null|  null|  null|     1|     1|     1|
#+----------+------+------+------+------+------+------+------+

*如果不是,请首先replace blanks with null