Saltar al contenido

pyspark reemplaza todos los valores en el marco de datos con otros valores

Posterior a de esta larga recopilación de información dimos con la solución este contratiempo que suelen tener ciertos los lectores. Te ofrecemos la respuesta y deseamos servirte de gran apoyo.

Solución:

Para string Tengo tres valores: aprobado, fallido y null. ¿Cómo reemplazo esos nulos con 0? fillna(0) solo funciona con números enteros

Primero, importa cuando y iluminado

from pyspark.sql.functions import when, lit

Suponiendo que su DataFrame tiene estas columnas

# Reconstructing my DataFrame based on your assumptions
# cols are Columns in the DataFrame
cols = ['name', 'age', 'col_with_string']

# Similarly the values
vals = [
     ('James', 18, 'passed'),
     ('Smith', 15, 'passed'),
     ('Albie', 32, 'failed'),
     ('Stacy', 33, None),
     ('Morgan', 11, None),
     ('Dwight', 12, None),
     ('Steve', 16, 'passed'), 
     ('Shroud', 22, 'passed'),
     ('Faze', 11,'failed'),
     ('Simple', 13, None)
]

# This will create a DataFrame using 'cols' and 'vals'
# spark is an object of SparkSession
df = spark.createDataFrame(vals, cols)

# We have the following DataFrame
df.show()

+------+---+---------------+
|  name|age|col_with_string|
+------+---+---------------+
| James| 18|         passed|
| Smith| 15|         passed|
| Albie| 32|         failed|
| Stacy| 33|           null|
|Morgan| 11|           null|
|Dwight| 12|           null|
| Steve| 16|         passed|
|Shroud| 22|         passed|
|  Faze| 11|         failed|
|Simple| 13|           null|
+------+---+---------------+

Puedes usar:

  • conColumna() - Para especificar la columna que desea utilizar.
  • es nulo() - Un filtro que evalúa a true si y si la attribute evalúa a null
  • iluminado() - crea una columna para literales
  • cuando(), de lo contrario() - se utiliza para comprobar la condición con respecto a la columna

Puedo reemplazar los valores que tienen null con 0

df = df.withColumn('col_with_string', when(df.col_with_string.isNull(), 
lit('0')).otherwise(df.col_with_string))

# We have replaced nulls with a '0'
df.show()

+------+---+---------------+
|  name|age|col_with_string|
+------+---+---------------+
| James| 18|         passed|
| Smith| 15|         passed|
| Albie| 32|         failed|
| Stacy| 33|              0|
|Morgan| 11|              0|
|Dwight| 12|              0|
| Steve| 16|         passed|
|Shroud| 22|         passed|
|  Faze| 11|         failed|
|Simple| 13|              0|
+------+---+---------------+

Parte 1 de su pregunta: Sí/No valores booleanos: mencionó que hay 100 columnas de valores booleanos. Para esto, generalmente reconstruyo la tabla con valores actualizados o creo un UDF que devuelve 1 o 0 para Sí o No.

Estoy agregando dos columnas más can_vote y can_lotto al DataFrame (df)

df = df.withColumn("can_vote", col('Age') >= 18)
df = df.withColumn("can_lotto", col('Age') > 16) 

# Updated DataFrame will be
df.show()

+------+---+---------------+--------+---------+
|  name|age|col_with_string|can_vote|can_lotto|
+------+---+---------------+--------+---------+
| James| 18|         passed|    true|     true|
| Smith| 15|         passed|   false|    false|
| Albie| 32|         failed|    true|     true|
| Stacy| 33|              0|    true|     true|
|Morgan| 11|              0|   false|    false|
|Dwight| 12|              0|   false|    false|
| Steve| 16|         passed|   false|    false|
|Shroud| 22|         passed|    true|     true|
|  Faze| 11|         failed|   false|    false|
|Simple| 13|              0|   false|    false|
+------+---+---------------+--------+---------+

Suponiendo que tiene columnas similares a can_vote y can_lotto (los valores booleanos son Sí/No)

Puede usar la siguiente línea de código para obtener las columnas en el DataFrame que tienen un tipo booleano

col_with_bool = [item[0] for item in df.dtypes if item[1].startswith('boolean')]

Esto devuelve una lista

['can_vote', 'can_lotto']

Puede crear una UDF e iterar para cada columna en este tipo de lista, encienda cada una de las columnas usando 1 (Sí) o 0 (No).

Para referencia, consulte los siguientes enlaces

  • es nulo(): https://spark.apache.org/docs/2.2.0/api/java/org/apache/spark/sql/sources/IsNull.html
  • iluminado, cuando: https://spark.apache.org/docs/1.6.2/api/java/org/apache/spark/sql/functions.html

Traté de replicar su problema con los siguientes datos:

df_test=pd.DataFrame([['yes','pass',1.2],['No','pass',34],['yes',None,0.4],[0,1,'No'],['No',1,True],['NO','YES',1]])

entonces solo uso:

df_test.replace('yes',1)

Te invitamos a estimular nuestro ensayo escribiendo un comentario y valorándolo te damos las gracias.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada.