es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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
Tags:  , ,

Answer

  1. Avatar for davy.ai

    Se puede utilizar la función lag para lograr esto. La función lag 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 columna CD_PRE está en la columna CD:
    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 columna CD es la CD_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í:

    CD CD_PRE OBJ_ID 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

Comments are closed.