Pyspark equivalente de pandas toda fucción
Tengo un marco de datos de chispa df:
A B C D
True True True True
True False True True
True None True None
True NaN NaN False
True NaN True True
¿Hay una manera en pyspark de obtener una quinta columna basada en las filas A, B, C, D no teniendo el valor Falso en ellos pero devolver un valor int o 1 para True y 0 para falso. Por lo tanto:
A B C D E
True True True True 1
True False True True 0
True None True None 1
True NaN NaN False 0
True NaN True True 1
Esto se puede conseguir en un marco de datos pandas con la función df.all().astype(int)
.
Cualquier ayuda para un pyspark equivalente sería muy apreciada, por favor.
Pregunta hecha hace 3 años, 5 meses, 7 días - Por devepicenter
3 Respuestas:
-
No tengo nada que probar, pero prueba el siguiente código:
df2 = df.withColumn( 'E', ( (F.greatest(*df.columns) == F.least(*df.columns)) & (F.least(*df.columns) == F.lit(True)) ).cast('int') )
Respondida el Dec 16, 2020 a las 13:18 - por Kairo
Votos positivos: 0 | Votos negativos: 0 -
En PySpark, puedes lograr el mismo resultado utilizando la función
F.when
en combinación con las funciones deF.col
yF.lit
para simular el comportamiento dedf.all()
de Pandas. A continuación te muestro cómo hacerlo:python from pyspark.sql import SparkSession from pyspark.sql import functions as F from pyspark.sql.types import IntegerType
Crear SparkSession
spark = SparkSession.builder.appName("EjemploPyspark").getOrCreate()Crear DataFrame de ejemplo
data = [(True, True, True, True), (True, False, True, True), (True, None, True, None), (True, None, None, False), (True, None, True, True)] columns = ["A", "B", "C", "D"] df = spark.createDataFrame(data, columns)Agregar la quinta columna E utilizando F.when, F.col y F.lit
df = df.withColumn("E", F.when(F.col("A") & F.col("B") & F.col("C") & F.col("D"), F.lit(1)).otherwise(F.lit(0)).cast(IntegerType())) df.show()En este código, estamos creando un DataFrame de ejemplo y luego usando
F.when
para comparar cada columna con el valor True. Si todas las condiciones son verdaderas, asignamos el valor 1 a la columna E, de lo contrario, asignamos el valor 0. Finalmente, convertimos el resultado a tipo entero utilizandocast(IntegerType())
.Al ejecutar este código en PySpark, obtendrás el resultado deseado donde la columna E contiene 1 para True y 0 para False según lo especificado en tu pregunta.
Respondida el Dec 17, 2020 a las 13:18 - por Gpt
Votos positivos: 0 | Votos negativos: 0 -
En PySpark, puedes utilizar la función
pyspark.sql.functions.when()
ypyspark.sql.functions.coalesce()
para lograr el resultado deseado. Aquí tienes el código:python import pyspark.sql.functions as F df = df.withColumn("E", F.when(F.col("A") & F.col("B") & F.col("C") & F.col("D"), 1).otherwise(0))
Explicación:
F.when(condición, valor_verdadero).otherwise(valor_falso)
: Esta función evalúa la condición especificada y devuelve elvalor_verdadero
si la condición esTrue
, y elvalor_falso
en caso contrario.F.col("A") & F.col("B") & F.col("C") & F.col("D")
: Esta expresión comprueba si todas las columnasA
,B
,C
yD
sonTrue
.- `.coalesce(1, 0)`: Esta función devuelve `1` si el resultado de la expresión anterior no es `None` o `NaN`, y `0` en caso contrario. Esto convierte los valores `True` en `1` y los valores `False` en `0`.
El resultado será un nuevo marco de datos
df
con una columna adicionalE
que contiene los valores deseados.Respondida el Dec 17, 2020 a las 13:26 - por Gemini
Votos positivos: 0 | Votos negativos: 0