我不確定我的問題標題是否有意義,所以我將在下面舉例說明。
我有一個資料框(在使用 PySpark 的 Databricks 中),如下所示:
截至 2020 年 11 月,所有 Stack Exchange 站點現在都支持表 Markdown。
| 日期 | 類別 |
|---|---|
| 2021-01-02 | 一種 |
| 2021-01-06 | 一種 |
| 2021-01-07 | 一種 |
| 2021-01-10 | 乙 |
| 2021-01-15 | 一種 |
| 2021-01-16 | 一種 |
| 2021-01-18 | 一種 |
| 2021-01-23 | 乙 |
| 2021-01-25 | 一種 |
我正在嘗試獲取 A 類和下一個 B 類之間的日期差異(以天為單位),示例如下:
| 日期 | 類別 | 天數差異 |
|---|---|---|
| 2021-01-02 | 一種 | 8 |
| 2021-01-06 | 一種 | 4 |
| 2021-01-07 | 一種 | 3 |
| 2021-01-10 | 乙 | |
| 2021-01-15 | 一種 | 8 |
| 2021-01-16 | 一種 | 7 |
| 2021-01-18 | 一種 | 5 |
| 2021-01-23 | 乙 | |
| 2021-01-25 | 一種 | ... |
有沒有人對最好的方法有任何想法?謝謝!
uj5u.com熱心網友回復:
您可以使用視窗函式來實作這一點。
首先,當 Category 為 B 時,創建一個僅包含 Date 的列。
df = df.withColumn('BDate', when(df.Category == 'B', df.Date))
---------- -------- ----------
| Date|Category| BDate|
---------- -------- ----------
|2021-01-02| A| null|
|2021-01-06| A| null|
|2021-01-07| A| null|
|2021-01-10| B|2021-01-10|
|2021-01-15| A| null|
...
然后,創建一個視窗,該視窗可以從當前行查找任何后續行并BDate在視窗中找到第一行。取當前Date和BDate找到的日期之間的日期差。
w = Window.orderBy('Date').rowsBetween(0, Window.unboundedFollowing)
df = df.withColumn('Days Diff', F.datediff(F.first(df.BDate, ignorenulls=True).over(w), df.Date))
結果
---------- -------- ---------- ---------
| Date|Category| BDate|Days Diff|
---------- -------- ---------- ---------
|2021-01-02| A| null| 8|
|2021-01-06| A| null| 4|
|2021-01-07| A| null| 3|
|2021-01-10| B|2021-01-10| 0|
|2021-01-15| A| null| 8|
|2021-01-16| A| null| 7|
|2021-01-18| A| null| 5|
|2021-01-23| B|2021-01-23| 0|
|2021-01-25| A| null| null|
---------- -------- ---------- ---------
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/434271.html
