La guía o código que hallarás en este artículo es la resolución más rápida y efectiva que hallamos a tus dudas o problema.
Solución:
Puedes usar cualquiera na.replace
:
df = spark.createDataFrame([
('Tablet', ), ('Phone', ), ('PC', ), ('Other', ), (None, )
], ["device_type"])
df.na.replace(deviceDict, 1).show()
+-----------+
|device_type|
+-----------+
| Mobile|
| Mobile|
| Desktop|
| Other|
| null|
+-----------+
o mapa literal:
from itertools import chain
from pyspark.sql.functions import create_map, lit
mapping = create_map([lit(x) for x in chain(*deviceDict.items())])
df.select(mapping[df['device_type']].alias('device_type'))
+-----------+
|device_type|
+-----------+
| Mobile|
| Mobile|
| Desktop|
| null|
| null|
+-----------+
Tenga en cuenta que la última solución convertirá los valores que no están presentes en el mapeo en NULL
. Si este no es un comportamiento deseado, puede agregar coalesce
:
from pyspark.sql.functions import coalesce
df.select(
coalesce(mapping[df['device_type']], df['device_type']).alias('device_type')
)
+-----------+
|device_type|
+-----------+
| Mobile|
| Mobile|
| Desktop|
| Other|
| null|
+-----------+
Aquí hay una pequeña función de ayuda, inspirada en la R recode
función, que abstrae las respuestas anteriores. Como beneficio adicional, agrega la opción de un valor predeterminado.
from itertools import chain
from pyspark.sql.functions import col, create_map, lit, when, isnull
from pyspark.sql.column import Column
df = spark.createDataFrame([
('Tablet', ), ('Phone', ), ('PC', ), ('Other', ), (None, )
], ["device_type"])
deviceDict = 'Tablet':'Mobile','Phone':'Mobile','PC':'Desktop'
df.show()
+-----------+
|device_type|
+-----------+
| Tablet|
| Phone|
| PC|
| Other|
| null|
+-----------+
Aquí está la definición de recode
.
def recode(col_name, map_dict, default=None):
if not isinstance(col_name, Column): # Allows either column name string or column instance to be passed
col_name = col(col_name)
mapping_expr = create_map([lit(x) for x in chain(*map_dict.items())])
if default is None:
return mapping_expr.getItem(col_name)
else:
return when(~isnull(mapping_expr.getItem(col_name)), mapping_expr.getItem(col_name)).otherwise(default)
Crear una columna sin un valor predeterminado da null
/None
en todos los valores sin igual.
df.withColumn("device_type", recode('device_type', deviceDict)).show()
+-----------+
|device_type|
+-----------+
| Mobile|
| Mobile|
| Desktop|
| null|
| null|
+-----------+
Por otro lado, especificando un valor para default
reemplaza todos los valores no coincidentes con este valor predeterminado.
df.withColumn("device_type", recode('device_type', deviceDict, default='Other')).show()
+-----------+
|device_type|
+-----------+
| Mobile|
| Mobile|
| Desktop|
| Other|
| Other|
+-----------+
Puedes hacer esto usando df.withColumn
también:
from itertools import chain
from pyspark.sql.functions import create_map, lit
deviceDict = 'Tablet':'Mobile','Phone':'Mobile','PC':'Desktop'
mapping_expr = create_map([lit(x) for x in chain(*deviceDict.items())])
df = df.withColumn('device_type', mapping_expr[df['dvice_type']])
df.show()
Calificaciones y comentarios
Puedes asistir nuestra función poniendo un comentario y dejando una puntuación te damos las gracias.