gpt4 book ai didi

python - 在 pyspark 数据框中循环两列时向新列添加值

转载 作者:行者123 更新时间:2023-12-01 06:55:45 25 4
gpt4 key购买 nike

我有一个带有列的 pyspark 数据框(除了更多列):每个月有多个 id。每个 ID 的事件状态由金额列确定。如果金额 > 0,则事件 = 1,否则为 0。

+-----------------------------+---
|id|amount| dates | active |
+-----------------------------+---
| X| 0|2019-05-01| 0 |
| X| 120|2019-06-01| 1 |
| Y| 60|2019-06-01| 1 |
| X| 0|2019-07-01| 0 |
| Y| 0|2019-07-01| 0 |
| Z| 50|2019-06-01| 1 |
| Y| 0|2019-07-01| 0 |
+-----------------------------+---

我想要计算和添加的新列是 p3mactive。它是根据过去三个月的活跃状态计算的。例如:对于 id = x,日期 = 2019-08-01,p3mactive = 1,因为 X 在 2019-06-01 处于事件状态。如果之前的月份不存在,则 p3m active = 0。如果只有 1 或 2 个月,则 p3m active 可以简单地计算为 max(active(month-1), active(month-2))。基本上是在现有栏目的基础上。

+-----------------------------+-----------+
|id|amount| dates | active | p3mactive |
+-----------------------------+-----------+
| X| 0|2019-05-01| 0 | 0 |
| X| 120|2019-06-01| 1 | 0 |
| Y| 60|2019-06-01| 1 | 0 |
| X| 0|2019-07-01| 0 | 1 |
| Y| 0|2019-07-01| 0 | 1 |
| Z| 50|2019-06-01| 1 | 0 |
| Y| 0|2019-07-01| 0 | 1 |
+-----------------------------+-----------+

所以基本上:

  1. 05 的 X 的事件值为 0,并且在此之前没有任何月份,因此 p3mactive 为 0。
  2. Y 在 06 年变得活跃,因此 p3mactive 在 07 年 = 1,而 p3mactive 在 06 年仍然为 0。
  3. Z 只有 06 的数据,因此 06 中的 p3mactive 为 0

等等。如果对流程有任何疑问,请告诉我。

我想使用 pyspark 中更好的数据帧操作和函数来实现这一点。我可以很容易地想到如何使用 pandas 或 python 来做到这一点,但我是 Spark 新手,无法想出一种方法来循环遍历每个给定月份的 ids,然后将前三个月的事件状态选择为 max (m1,m2,m3) 函数,如果前几个月不存在,则保留边缘条件。任何帮助将不胜感激。

最佳答案

您可以使用whenlag使用Window函数来做到这一点:

from pyspark.sql.window import Window
from pyspark.sql.functions import when, col, lag

w = Window().partitionBy("id").orderBy("dates")
df = df.withColumn("p3mactive", when(
(lag(df.active,1).over(w) == 1)|
(lag(df.active,2).over(w) == 1) |
(lag(df.active,3).over(w) == 1), 1).otherwise(0))

您无法循环遍历 pyspark 数据帧,但可以使用 Window 跨过它们。您可以使用 when 应用条件,并且可以使用 lag 查看之前的行,使用 lead 查看 future 的行。如果 x 之前的行不存在,则条件计算结果为 false,并且您将得到 0,如您的用例所述。

我希望这会有所帮助。

关于python - 在 pyspark 数据框中循环两列时向新列添加值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58813239/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com