Вы можете получить, взяв в этом столбце last
, что startswith
букву "X"
над Window
, которая разбивает на Customer
и заказывает поDay
.Укажите Window
для начала в начале раздела и остановки в текущей строке.
from pyspark.sql import Window
from pyspark.sql.functions import col, last, when
w = Window.partitionBy("Customer").orderBy("Day").rowsBetween(Window.unboundedPreceding, 0)
df = df.withColumn(
"MostRecentX",
last(when(col("Type").startswith("X"), col("Type")), ignorenulls=True).over(w)
)
df.show()
#+--------+---+----+-----------+
#|Customer|Day|Type|MostRecentX|
#+--------+---+----+-----------+
#| A| 2| X11| X11|
#| A| 4| X2| X2|
#| A| 9| Y4| X2|
#| A| 11| X1| X1|
#| B| 3| Y4| null|
#| B| 7| X1| X1|
#+--------+---+----+-----------+
Хитрость здесь в том, чтобы использовать when
для возврата Type
столбец, только если он начинается с "X"
.По умолчанию when
вернет null
.Затем мы можем использовать last
с ignorenulls=True
, чтобы получить значение для MostRecentX
.
Если вы хотите заменить null
на "-"
, как показано в вашем вопросе, просто позвоните fillna
в столбце MostRecentX
:
df.fillna("-", subset=["MostRecentX"]).show()
#+--------+---+----+-----------+
#|Customer|Day|Type|MostRecentX|
#+--------+---+----+-----------+
#| A| 2| X11| X11|
#| A| 4| X2| X2|
#| A| 9| Y4| X2|
#| A| 11| X1| X1|
#| B| 3| Y4| -|
#| B| 7| X1| X1|
#+--------+---+----+-----------+