python - matriz - nueva columna pandas
Spark agrega una nueva columna al dataframe con valor de la fila anterior (1)
Puede usar la función de ventana de lag
siguiente manera
from pyspark.sql.functions import lag, col
from pyspark.sql.window import Window
df = sc.parallelize([(4, 9.0), (3, 7.0), (2, 3.0), (1, 5.0)]).toDF(["id", "num"])
w = Window().partitionBy().orderBy(col("id"))
df.select("*", lag("num").over(w).alias("new_col")).na.drop().show()
## +---+---+-------+
## | id|num|new_col|
## +---+---+-------|
## | 2|3.0| 5.0|
## | 3|7.0| 3.0|
## | 4|9.0| 7.0|
## +---+---+-------+
pero hay algunos problemas importantes:
- si necesita una operación global (no particionada por alguna otra columna / columna) es extremadamente ineficiente.
- necesita una forma natural de ordenar sus datos.
Si bien el segundo problema casi nunca es un problema, el primero puede ser un factor decisivo. Si este es el caso, simplemente debe convertir su DataFrame
a RDD y calcular el lag
manualmente. Ver por ejemplo:
- Cómo transformar los datos con la ventana deslizante sobre los datos de la serie temporal en Pyspark
- Apache Spark Moving Average (escrito en Scala, pero se puede ajustar para PySpark. Asegúrese de leer primero los comentarios).
Otros enlaces útiles:
Me pregunto cómo puedo lograr lo siguiente en Spark (Pyspark)
Dataframe inicial:
+--+---+
|id|num|
+--+---+
|4 |9.0|
+--+---+
|3 |7.0|
+--+---+
|2 |3.0|
+--+---+
|1 |5.0|
+--+---+
Dataframe resultante:
+--+---+-------+
|id|num|new_Col|
+--+---+-------+
|4 |9.0| 7.0 |
+--+---+-------+
|3 |7.0| 3.0 |
+--+---+-------+
|2 |3.0| 5.0 |
+--+---+-------+
En general, logro "agregar" nuevas columnas a un marco de datos usando algo como: df.withColumn("new_Col", df.num * 10)
Sin embargo, no tengo idea de cómo puedo lograr este "cambio de filas" para la nueva columna, de modo que la nueva columna tenga el valor de un campo de la fila anterior (como se muestra en el ejemplo). Tampoco pude encontrar nada en la documentación de la API sobre cómo acceder a una determinada fila en un DF por índice.
Cualquier ayuda sería apreciada.