Reemplazar cadena basado en diccionario pyspark
Nuevo en pyspark, me gustaría reemplazar una cadena de columna basada en un diccionario.
A continuación se muestra una lista de ejemplo con caracteres especiales (la real contiene nombres)
lists = ['.', ',', '*', '+', '-', '_', '(', ')', '{', '}', '[', ']', ';', ':', '/', '|', '<', '>', '^', '$', '#', '@', '!', '?', '~', '\"', '\'\'', '´', '`', ' ', '..','&']
dic_name = {}
for element in lists:
dic_name[element] = ' '
Esto es lo que he intentado hasta ahora sin resultados
# Replace key by Value
for key, value in dic_name.items():
df = df.withColumn('Name_Clean', regexp_replace('Name', key, value))
En Pandas, pude hacer algo como esto:
df[col] = df[col].str.replace(key, value, regex=True)
A continuación se muestra el df
df = spark.createDataFrame([(1, "#2A"), (2, "&PIM")], ["id", "Name"])
| id|Name |
+---+------+
| 1|#2A |
| 2|&PIM|
Salida esperada después de aplicar la función
| id|Name |Name_Clean |
+---+------+-----------+
| 1|#2A |2A |
| 2|&PIM|PIM |
davy.ai
Para reemplazar una cadena de texto de una columna en función de un diccionario en PySpark, puedes utilizar la función
regexp_replace
junto con unaudf
(función definida por el usuario) para aplicar el diccionario. Aquí tienes el código que puedes utilizar:Esto mostrará como resultado:
Explicación:
dic_name
para reemplazar cada caracter especial por un espacio.replace_udf
que aplica el diccionario a una cadena de texto. La función lambda dentro de la UDF mapea cada caracter de la cadenax
a su valor correspondiente en el diccionario, o al caracter mismo si no está en el diccionario. La funciónjoin
concatena los caracteres resultantes en una nueva cadena de texto.Name
utilizando la funciónwithColumn
para crear una nueva columna llamadaName_Clean
.Nota: El enfoque de la UDF puede ser lento para dataframes muy grandes, en cuyo caso puedes considerar utilizar la función
regexp_replace
de PySpark con una expresión regular que coincida con todos los caracteres especiales que deseas reemplazar. Por ejemplo:Esto mostrará el mismo resultado que antes.