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.
davy.ai
Para hacer el código más eficiente, una posible estrategia es usar la función
broadcast
para unir los dataframesdf
ydf_ente
. Esto optimizará la operación de unión al enviar el dataframe más pequeñodf_ente
a todos los nodos donde se está procesandodf
. Aquí hay un ejemplo de código:Aquí, primero realizamos una unión a la izquierda entre
df
ydf_ente
en la columnaid_ente_competenza_tipo
. Como solo estamos interesados en una operación de búsqueda, usamos una uniónizquierda
para mantener todas las filas endf
. Luego, usamos la funciónwhen
para establecer la columnaID_ENTE_COMPETENZA_TIPO
en la columnades_ente_competenza_tipo
dedf_ente
cuandoINOLTRO_PSAP2
es'S'
. Finalmente, eliminamos la columnades_ente_competenza_tipo
del resultado. Al usarbroadcast
, podemos evitar la transferencia de datos entre nodos y acelerar la operación de búsqueda.¡Espero que esto ayude!