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.

Obtenga el valor de otra tabla estática cuando “ID_ENTE_COMPETENZA_TIPO” sea igual a ‘S’ en un dataframe.

Tengo un dataframe sencillo como este:

df
    id_ente_competenza_tipo | INOLTRO_PSAP2 
       3                           S    
       3                           S
       3                           N
       2                           S

Tengo otra tabla estática:

df_ente
id_ente_competenza_tipo| des_ente_competenza_tipo
  1                       Carabinieri
  2                       Polizia di Stato
  3                       Emergenza Sanitaria

Quiero que si df.ID_ENTE_COMPETENZA_TIPO == ‘S’ –> df.ID_ENTE_COMPETENZA_TIPO = df_ente.des_ente_competenza_tipo donde df.id_ente_competenza_tipo == df_ente.id_ente_competenza_tipo, de lo contrario df.id_ente_competenza_tipo.

Quiero esto:

id_ente_competenza_tipo |    INOLTRO_PSAP2 
         Emergenza Sanitaria      S    
         Emergenza Sanitaria      S
         3                        N
         Polizia di Stato         S

Mi código es este, pero hay una manera más eficiente?

df=df.withColumn("ID_ENTE_COMPETENZA_TIPO",F.when(df.INOLTRO_PSAP2=="S",df_ente.join(df,
df_ente["id_ente_competenza_tipo"]==df["ID_ENTE_COMPETENZA_TIPO"])\
.select("des_ente_competenza_tipo").head()[0]).otherwise(df.ID_ENTE_COMPETENZA_TIPO))

Gracias por la ayuda
Saludos.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para hacer el código más eficiente, una posible estrategia es usar la función broadcast para unir los dataframes df y df_ente. Esto optimizará la operación de unión al enviar el dataframe más pequeño df_ente a todos los nodos donde se está procesando df. Aquí hay un ejemplo de código:

    import pyspark.sql.functions as F
    from pyspark.sql.functions import broadcast
    
    df = df.join(broadcast(df_ente), on='id_ente_competenza_tipo', how='left') \
           .withColumn('ID_ENTE_COMPETENZA_TIPO', 
                       F.when(df.INOLTRO_PSAP2=='S', F.col('des_ente_competenza_tipo')) \
                        .otherwise(df.ID_ENTE_COMPETENZA_TIPO)) \
           .drop('des_ente_competenza_tipo')
    
    

    Aquí, primero realizamos una unión a la izquierda entre df y df_ente en la columna id_ente_competenza_tipo. Como solo estamos interesados en una operación de búsqueda, usamos una unión izquierda para mantener todas las filas en df. Luego, usamos la función when para establecer la columna ID_ENTE_COMPETENZA_TIPO en la columna des_ente_competenza_tipo de df_ente cuando INOLTRO_PSAP2 es 'S'. Finalmente, eliminamos la columna des_ente_competenza_tipo del resultado. Al usar broadcast, podemos evitar la transferencia de datos entre nodos y acelerar la operación de búsqueda.

    ¡Espero que esto ayude!

Comments are closed.