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.

Convertir fila en columnas en un dataframe de Pyspark.

Mi actual dataframe de pyspark es así:

Región Ubicación Mes Servicios Tipo valores_en_millones valores_en_porcentaje
USA USA 1/1/2021 ABC DC 101537.553 34.775
Europa Italia 2/1/2021 ABC DC 434404.87 44.653
Europa España 2/1/2021 ABC DC 895057.332 21.925
Asia India 3/1/2021 ABC DC 211963.21 27.014

Mi dataframe deseado debería tener esta forma:

Región Ubicación Mes Servicios Tipo clave_1 valores_1 valores_2
USA USA 1/1/2021 ABC DC valores_en_millones 101537.553
Europa Italia 2/1/2021 ABC DC valores_en_millones 434404.87
Europa España 2/1/2021 ABC DC valores_en_millones 895057.332
Asia India 3/1/2021 ABC DC valores_en_millones 211963.21
USA USA 1/1/2021 ABC DC valores_en_porcentaje 34.775%
Europa Italia 2/1/2021 ABC DC valores_en_porcentaje 44.653%
Europa España 2/1/2021 ABC DC valores_en_porcentaje 21.925%
Asia India 3/1/2021 ABC DC valores_en_porcentaje 27.014%

Cualquier enfoque será de ayuda…

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para obtener el dataframe deseado, necesitaremos realizar una transformación pivot en el dataframe original. Un posible enfoque es el siguiente:

    from pyspark.sql.functions import col, when
    
    # crear dos dataframes con las columnas requeridas
    df_millions = df.select('Region', 'Location', 'Month', 'Services', 'Type',
                            col('values_in_millions').alias('values_1'),
                            when(col('values_in_percent').isNull(), '').otherwise('values_in_percent').alias('key_1'),
                            col('values_in_percent').alias('values_2'))
    
    df_percent = df.select('Region', 'Location', 'Month', 'Services', 'Type',
                           when(col('values_in_millions').isNull(), '').otherwise('values_in_millions').alias('key_1'),
                           col('values_in_millions').alias('values_1'),
                           col('values_in_percent').alias('values_2'))
    
    # unir los dos dataframes
    df_final = df_millions.union(df_percent)
    
    # pivotar el dataframe
    df_pivoted = df_final.groupBy('Region', 'Location', 'Month', 'Services', 'Type', 'key_1') \
                         .pivot('key_1') \
                         .agg({'values_1': 'first', 'values_2': 'first'})
    
    # renombrar las columnas para que coincidan con el formato deseado
    df_renamed = df_pivoted.select('Region', 'Location', 'Month', 'Services', 'Type',
                                   col('values_in_millions').alias('key_1'),
                                   col('values_1'),
                                   col('values_in_percent').alias('values_2')) \
                           .orderBy('Region', 'Location', 'Month')
    

    La idea básica detrás de este enfoque es dividir el dataframe original en dos dataframes separados, uno para las columnas ‘values_in_millions’ y otro para las columnas ‘values_in_percent’. Luego, agregamos una nueva columna ‘key_1’ que contiene el nombre de la columna original (ya sea ‘values_in_millions’ o ‘values_in_percent’). Después de eso, unimos los dos dataframes y pivoteamos el dataframe resultante para obtener la salida deseada.

    Tenga en cuenta que el código anterior asume que las columnas ‘values_in_millions’ y ‘values_in_percent’ son mutuamente excluyentes, es decir, si una columna tiene valores nulos, la otra columna tiene valores no nulos. Si esta suposición no es válida para su caso de uso particular, puede que necesite ajustar el código en consecuencia.

Comments are closed.