Rellenar recursivamente una columna en Pyspark.
Tengo un Dataframe de Pyspark con las siguientes columnas:
CD | CDPRE | OBJID |
---|---|---|
123 | null | 1 |
456 | 123 | 2 |
789 | 456 | 3 |
098 | null | 1 |
765 | null | 1 |
432 | 765 | 2 |
Lo que necesito hacer es comprobar si el valor en la columna “CDPRE” está en la columna “CD” hasta llegar a la fila donde “CDPRE” está vacío y “CD” es el “CDPRE” de la fila anterior. Luego, tengo que crear una columna y rellenarla con “OBJID” de la fila donde “CD_PRE” está vacío.
En resumen, este es el resultado deseado:
CD | CDPRE | OBJID | RESULT |
---|---|---|---|
123 | null | 1 | null |
456 | 123 | 2 | 1 |
789 | 456 | 3 | 1 |
098 | null | 1 | null |
765 | null | 1 | None |
432 | 765 | 2 | 1 |
davy.ai
Se puede utilizar la función
lag
para lograr esto. La funciónlag
devuelve el valor de una columna de la fila anterior.Primero, cree una nueva columna “RESULT” y establezca su valor en
null
:df = df.withColumn('RESULT', lit(null))
Luego, utilice la función
lag
para comprobar si el valor en la columnaCD_PRE
está en la columnaCD
:df = df.withColumn('RESULT', when(col('CD') == lag('CD_PRE', 1).over(), lag('OBJ_ID', 1).over()).otherwise(col('RESULT')))
Finalmente, compruebe si la columna
CD_PRE
está vacía y la columnaCD
es laCD_PRE
de la fila anterior:df = df.withColumn('RESULT', when((col('CD_PRE').isNull()) & (col('CD') == lag('CD_PRE', 1).over()), lag('OBJ_ID', 1).over()).otherwise(col('RESULT')))
El Dataframe resultante debería verse así: