J'essaie de résoudre un problème avec pyspark,
J'ai un ensemble de données tel que:
Condition | Date | Lag 0 | 2019/01/10 | NaN 1 | 2019/01/11 | NaN 0 | 2019/01/15 | 2019/01/11 1 | 2019/01/16 | 2019/01/11 1 | 2019/01/19 | 2019/01/16 0 | 2019/01/23 | 2019/01/19 0 | 2019/01/25 | 2019/01/19 1 | 2019/01/29 | 2019/01/19 1 | 2019/01/30 | 2019/01/29
Je voudrais obtenir la dernière valeur de décalage de la date colonne lorsque la condition == 1 était remplie
La sortie souhaitée serait quelque chose comme:
Condition | Date 0 | 2019/01/10 1 | 2019/01/11 0 | 2019/01/15 1 | 2019/01/16 1 | 2019/01/19 0 | 2019/01/23 0 | 2019/01/25 1 | 2019/01/29 1 | 2019/01/30
Comment puis-je effectuer cela?
Veuillez garder à l'esprit qu'il s'agit d'un très grand ensemble de données - que je devrai partitionner et regrouper par un UUID pour que la solution soit quelque peu performante.
Merci,
3 Réponses :
En SQL, vous pouvez utiliser une exécution conditionnelle max()
:
select t.*, max(case when condition = 1 then date end) over (order by date rows between unbounded preceding and 1 preceding ) as prev_condition_1_date from t;
Salut! Merci pour la réponse rapide, j'essaie de l'implémenter sur pyspark mais j'ai un peu de mal.
Voici une solution avec Pyspark. La logique reste la même que la solution de @ GordonLinoff avec requête SQL.
+---------+----------+----------+ |Condition| Date| Lag| +---------+----------+----------+ | 0|2019/01/10| null| | 1|2019/01/11| null| | 0|2019/01/15|2019/01/11| | 1|2019/01/16|2019/01/11| | 1|2019/01/19|2019/01/16| | 0|2019/01/23|2019/01/19| | 0|2019/01/25|2019/01/19| | 1|2019/01/29|2019/01/19| | 1|2019/01/30|2019/01/29| +---------+----------+----------+
Donne :
w = Window.orderBy("Date").rowsBetween(Window.unboundedPreceding, Window.currentRow - 1) df.withColumn("Lag", max(when(col("Condition") == lit(1), col("Date"))).over(w)).show()
J'aime utiliser SQL pour résoudre ce problème:
from pyspark.sql.functions import expr display( df.withColumn( 'lag', expr('max(case when Condition == 1 then Date end) over (order by Date rows between unbounded preceding and 1 preceding)' ) )