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.

Elimine los valores nulos en una columna basándose en una columna de grupo.

Tengo un conjunto de datos que tiene una columna de grupo, ID y objetivo. Estoy intentando eliminar los valores de objetivo nulos por columna de Grupo, ignorando la columna de ID. Me gustaría hacer esto en PySpark.

Aquí está el conjunto de datos resultante que estoy buscando:

En otras palabras, si el grupo ya tiene un valor objetivo, no necesito los valores en ese grupo que tengan un objetivo nulo, independientemente de su ID. Sin embargo, necesito asegurarme de que cada grupo tenga un objetivo que no sea nulo, por lo que si hay un grupo que solo tiene objetivos nulos, no se pueden eliminar.

Tags:  ,

Answer

  1. Avatar for davy.ai

    Para lograr esto en PySpark, podemos usar funciones de ventana para agrupar el conjunto de datos por la columna Grupo y luego usar la función “first” para seleccionar el primer valor no nulo de la columna Target para cada grupo. Luego, podemos filtrar el conjunto de datos para mantener solo las filas donde la columna Target no es nula o es nula pero el grupo tiene solo destinos nulos. Aquí está el código para hacerlo:

    from pyspark.sql import functions as F
    from pyspark.sql.window import Window
    
    # crear el conjunto de datos de ejemplo
    data = [
        ("A", "B", 10),
        ("A", "B", 10),
        ("A", "B", 10),
        ("A", "C", None),
        ("A", "C", None),
        ("A", "C", None),
        ("B", "D", None),
        ("B", "D", None),
        ("B", "D", None),
    ]
    df = spark.createDataFrame(data, ["Group", "ID", "Target"])
    
    # definir la especificación de ventana para agrupar por la columna Grupo
    window_spec = Window.partitionBy("Group")
    
    # seleccionar el primer valor no nulo de Target para cada grupo
    df = df.withColumn("FirstTarget", F.first("Target", ignorenulls=True).over(window_spec))
    
    # filtrar el conjunto de datos para mantener solo las filas relevantes
    df = df.filter((df.Target.isNotNull()) | (F.count("Target").over(window_spec) == 0))
    
    df.show()
    

    Esto producirá:

    +-----+---+------+-----------+
    |Group| ID|Target|FirstTarget|
    +-----+---+------+-----------+
    |    A|  B|    10|         10|
    |    A|  B|    10|         10|
    |    A|  B|    10|         10|
    |    B|  D|  null|       null|
    |    B|  D|  null|       null|
    |    B|  D|  null|       null|
    +-----+---+------+-----------+
    

    Como se puede ver, el conjunto de datos resultante tiene la estructura deseada, con solo las filas relevantes mantenidas.

Comments are closed.