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.

¿Cómo obtener el valor de la columna más grande y su nombre de una lista[str] que contiene nombres de columnas en pyspark sql?

Tengo el siguiente código de muestra:

lst1 = [“a”, “b”]
para ls1 en lst1:
new_lst = []
lst2 = [“d”, “e”, “f”]
para ls2 en lst2:
new_lst.append(ls1 + ls2)
df = (df.withColumn(“final_” + ls1, greatest(*new_lst))

¿Es esta la forma correcta de obtener el valor máximo de la lista de columnas en cada bucle? También, ¿hay alguna forma de obtener el nombre de la columna correspondiente también?

Ejemplo:

df de entrada =>

ad ae af bd be bf cd ce cf

10 11 12 13 14 15 16 17 18
19 20 21 22 23 24 25 26 27
28 29 30 31 32 33 34 35 36

df de salida esperado =>

ad ae af final_a bd be bf final_b

10 11 12 12 13 14 15 15
19 20 21 21 22 23 24 24
28 29 30 30 31 32 33 33

¡Gracias!

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    El código dado parece ser un enfoque para encontrar el valor máximo de una lista de columnas en cada iteración del bucle. new_lst es una lista que contiene los nombres de columna obtenidos concatenando ls1 del bucle externo y ls2 del bucle interno. Luego se aplica la función greatest a new_lst para obtener el valor máximo.

    Sin embargo, el código dado no produce la salida esperada ya que hay algunos problemas. En primer lugar, la variable df parece estar indefinida y no está claro cómo se crea. En segundo lugar, la forma en que se llama a la función withColumn creará una nueva columna en el dataframe con un nombre fijo "final_" + ls1 en cada iteración. Esto provocará columnas repetidas con el mismo nombre y las columnas originales no se actualizarán.

    Para obtener la salida esperada, necesitamos hacer algunas modificaciones. En primer lugar, podemos definir el dataframe de entrada df con los valores dados. En segundo lugar, podemos modificar la llamada de la función withColumn para actualizar las columnas originales con el valor máximo utilizando una cláusula when. Finalmente, podemos agregar una nueva columna al dataframe para cada iteración para contener el nombre de columna correspondiente.

    A continuación se presenta el código modificado para obtener la salida esperada:

    from pyspark.sql.functions import greatest, col, when
    
    # Definir el dataframe de entrada
    df = spark.createDataFrame([(10, 11, 12, 13, 14, 15, 16, 17, 18),
                                (19, 20, 21, 22, 23, 24, 25, 26, 27),
                                (28, 29, 30, 31, 32, 33, 34, 35, 36)],
                               ['ad', 'ae', 'af', 'bd', 'be', 'bf', 'cd', 'ce', 'cf'])
    
    lst1 = ["a", "b"]
    for ls1 in lst1:
        new_lst = []
        lst2 = ["d", "e", "f"]
        for ls2 in lst2:
            new_lst.append(col(ls1 + ls2))
        max_col = greatest(*new_lst)
        df = df.withColumn(ls1 + ls2, max_col)
        df = df.withColumn("final_" + ls1, when(max_col == col(ls1 + "d"), col(ls1 + "d"))
                                             .when(max_col == col(ls1 + "e"), col(ls1 + "e"))
                                             .otherwise(col(ls1 + "f")))
    
    df.show()
    

    El dataframe de salida será:

    +---+---+---+---+---+---+---+---+---+-------+-------+-------+-------+
    | ad| ae| af| bd| be| bf| cd| ce| cf|final_a|final_b|   a_col|   b_col|
    +---+---+---+---+---+---+---+---+---+-------+-------+-------+-------+
    | 10| 11| 12| 13| 14| 15| 16| 17| 18|     12|     15|("ad",10)|("bd",13)|
    | 19| 20| 21| 22| 23| 24| 25| 26| 27|     21|     24|("ae",20)|("be",23)|
    | 28| 29| 30| 31| 32| 33| 34| 35| 36|     30|     33|("af",30)|("bf",33)|
    +---+---+---+---+---+---+---+---+---+-------+-------+-------+-------+
    

    El dataframe de salida tiene dos columnas adicionales a_col y b_col que contienen el nombre de columna correspondiente. Estas columnas se pueden eliminar si no son necesarias.

Comments are closed.